varios usar tiempo saber registros registro not mismo insertar existe ejemplo como actualizar mysql

usar - MySQL: Insertar registro si no existe en la tabla



insertar y actualizar al mismo tiempo en sql server (15)

Estoy tratando de ejecutar la siguiente consulta:

INSERT INTO table_listnames (name, address, tele) VALUES (''Rupert'', ''Somewhere'', ''022'') WHERE NOT EXISTS ( SELECT name FROM table_listnames WHERE name=''value'' );

Pero esto devuelve un error. Básicamente, no quiero insertar un registro si el campo ''nombre'' del registro ya existe en otro registro. ¿Cómo verificar si el nuevo nombre es único?


Brian Hooper: Casi alcanzas el punto pero tienes un error en tu sinatx. Tu inserción nunca funcionará. He probado en mi base de datos y aquí está la respuesta correcta:

INSERT INTO podatki (datum,ura,meritev1,meritev1_sunki,impulzi1,meritev2,meritev2_sunki,impulzi2) SELECT ''$datum'', ''$ura'', ''$meritve1'',''$sunki1'',''$impulzi1'',''$meritve2'',''$sunki2'',''$impulzi2'' FROM dual WHERE NOT EXISTS (SELECT datum,ura FROM podatki WHERE datum=''$datum'' and ura=''$ura''

Te estoy dando mi ejemplo de tu tabla. Insertar es casi lo mismo que escribió Bian Hooper, excepto que puse la opción FROM FROM DUAL en la otra tabla. Saludos, Iván


En realidad, no estoy sugiriendo que hagas esto, ya que el índice UNIQUE tal como lo sugieren Piskvor y otros es una forma mucho mejor de hacerlo, pero puedes hacer lo que estabas intentando:

CREATE TABLE `table_listnames` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `address` varchar(255) NOT NULL, `tele` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB;

Insertar un registro:

INSERT INTO table_listnames (name, address, tele) SELECT * FROM (SELECT ''Rupert'', ''Somewhere'', ''022'') AS tmp WHERE NOT EXISTS ( SELECT name FROM table_listnames WHERE name = ''Rupert'' ) LIMIT 1; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 SELECT * FROM `table_listnames`; +----+--------+-----------+------+ | id | name | address | tele | +----+--------+-----------+------+ | 1 | Rupert | Somewhere | 022 | +----+--------+-----------+------+

Intenta volver a insertar el mismo registro:

INSERT INTO table_listnames (name, address, tele) SELECT * FROM (SELECT ''Rupert'', ''Somewhere'', ''022'') AS tmp WHERE NOT EXISTS ( SELECT name FROM table_listnames WHERE name = ''Rupert'' ) LIMIT 1; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 +----+--------+-----------+------+ | id | name | address | tele | +----+--------+-----------+------+ | 1 | Rupert | Somewhere | 022 | +----+--------+-----------+------+

Insertar un registro diferente:

INSERT INTO table_listnames (name, address, tele) SELECT * FROM (SELECT ''John'', ''Doe'', ''022'') AS tmp WHERE NOT EXISTS ( SELECT name FROM table_listnames WHERE name = ''John'' ) LIMIT 1; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 SELECT * FROM `table_listnames`; +----+--------+-----------+------+ | id | name | address | tele | +----+--------+-----------+------+ | 1 | Rupert | Somewhere | 022 | | 2 | John | Doe | 022 | +----+--------+-----------+------+

Y así...


Estás insertando no actualizando el resultado. Puede definir la columna de nombre en la columna principal o establecerla como única.


Esta consulta funciona bien:

INSERT INTO `user` ( `username` , `password` ) SELECT * FROM (SELECT ''ersks'', md5( ''Nepal'' )) AS tmp WHERE NOT EXISTS (SELECT `username` FROM `user` WHERE `username` = ''ersks'' AND `password` = md5( ''Nepal'' )) LIMIT 1

Y puedes crear la tabla usando la siguiente consulta:

CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(30) NOT NULL, `password` varchar(32) NOT NULL, `status` tinyint(1) DEFAULT ''0'', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Nota: cree una tabla utilizando la segunda consulta antes de intentar usar la primera consulta.


MySQL proporciona una solución muy linda:

REPLACE INTO `table` VALUES (5, ''John'', ''Doe'', SHA1(''password''));

Muy fácil de usar, ya que ha declarado una clave primaria única (aquí con valor 5).


Para superar un problema similar, he hecho que la tabla que estoy insertando tenga una columna única. Usando tu ejemplo, en la creación tendría algo como:

name VARCHAR(20), UNIQUE (name)

y luego use la siguiente consulta al insertarla:

INSERT IGNORE INTO train set table_listnames=''Rupert''


Se puede usar fácilmente de la siguiente manera:

INSERT INTO ... ON DUPLICATE KEY UPDATE ...

De esta manera, puede insertar cualquier nueva información en bruto y, si tiene datos duplicados, reemplace una columna específica (las mejores columnas son las marcas de tiempo).
Por ejemplo :

CREATE TABLE IF NOT EXISTS Devices ( id INT(6) NOT NULL AUTO_INCREMENT, unique_id VARCHAR(100) NOT NULL PRIMARY KEY, created_at VARCHAR(100) NOT NULL, UNIQUE KEY unique_id (unique_id), UNIQUE KEY id (id) ) CHARACTER SET utf8 COLLATE utf8_unicode_ci; INSERT INTO Devices(unique_id, time) VALUES(''$device_id'', ''$current_time'') ON DUPLICATE KEY UPDATE time = ''$current_time'';


Si realmente no puede obtener un índice único en la tabla, podría intentar ...

INSERT INTO table_listnames (name, address, tele) SELECT ''Rupert'', ''Somewhere'', ''022'' FROM some_other_table WHERE NOT EXISTS (SELECT name FROM table_listnames WHERE name=''Rupert'') LIMIT 1;


Trabajó :

INSERT INTO users (full_name, login, password) SELECT ''Mahbub Tito'',''tito'',SHA1(''12345'') FROM DUAL WHERE NOT EXISTS (SELECT login FROM users WHERE login=''tito'');


Tuve un problema similar y tuve que insertar varios si no existían. Así que de los ejemplos anteriores llegué a esta combinación ... está aquí en caso de que alguien la necesite.

Aviso: tuve que definir el nombre en todas partes ya que MSSQL lo requería ... MySQL funciona con * también.

INSERT INTO names (name) SELECT name FROM ( SELECT name FROM ( SELECT ''Test 4'' as name ) AS tmp_single WHERE NOT EXISTS ( SELECT name FROM names WHERE name = ''Test 4'' ) UNION ALL SELECT name FROM ( SELECT ''Test 5'' as name ) AS tmp_single WHERE NOT EXISTS ( SELECT name FROM names WHERE name = ''Test 5'' ) ) tmp_all;

MySQL: CREAR TABLA names ( OID int (11) NOT NULL AUTO_INCREMENT, name varchar (32) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY ( OID ), UNIQUE KEY name_UNIQUE ( name )) ENGINE = InnoDB AUTO_INCREMENT = 1;

o

MSSQL: CREAR TABLA [nombres] ([OID] IDENTIDAD INT (1, 1) NO NULO, [nombre] NVARCHAR (32) NO NULO, TECLA PRINCIPAL CLUSTRADA ([OID] ASC)); CREAR UN ÍNDICE ÚNICO NO CLUSIFICADO [Nombre_Nombre_Nombre] EN [nombres] ([nombre] ASC);


Tuve un problema, y ​​el método que Mike recomendó funcionó en parte, tuve un error Dublicate Column name = ''0'', y cambié la sintaxis de su consulta como esta ''

$tQ = "INSERT INTO names (name_id, surname_id, sum, sum2, sum3,sum4,sum5) SELECT ''$name'', ''$surname'', ''$sum'', ''$sum2'', ''$sum3'',''$sum4'',''$sum5'' FROM DUAL WHERE NOT EXISTS ( SELECT sum FROM names WHERE name_id = ''$name'' AND surname_id = ''$surname'') LIMIT 1;";

El problema era con los nombres de columna. sum3 era igual a sum4 y mysql lanzó nombres de columna duplicados, y escribí el código en esta sintaxis y funcionó perfectamente,


INSERT no permite WHERE en la sintaxis .

Lo que puede hacer: cree un UNIQUE INDEX en el campo que debe ser único ( name ), luego use:

  • INSERT normal (y manejar el error si el nombre ya existe)
  • INSERT IGNORE (que fallará silenciosamente causará una advertencia (en lugar de error) si el nombre ya existe)
  • INSERT ... ON DUPLICATE KEY UPDATE (que ejecutará la UPDATE al final si el nombre ya existe, consulte la documentación )

Esta consulta puede ser utilizada en código PHP.

Tengo una columna de ID en esta tabla, por lo que necesito verificar la duplicación de todas las columnas, excepto esta columna de ID:

#need to change values SET @goodsType = 1, @sybType=5, @deviceId = asdf12345SDFasdf2345; INSERT INTO `devices` (`goodsTypeId`, `goodsId`, `deviceId`) #need to change tablename and columnsnames SELECT * FROM (SELECT @goodsType, @sybType, @deviceId) AS tmp WHERE NOT EXISTS ( SELECT ''goodsTypeId'' FROM `devices` #need to change tablename and columns names WHERE `goodsTypeId` = @goodsType AND `goodsId` = @sybType AND `deviceId` = @deviceId ) LIMIT 1;

y ahora el nuevo elemento se agregará solo en caso de que no exista una fila con valores configurados en la cadena SET


INSERT IGNORE INTO `mytable` SET `field0` = ''2'', `field1` = 12345, `field2` = 12678;

Aquí la consulta mysql, que inserta registros si no existen e ignorará los registros similares existentes.

----Untested----


insert into customer_keyskill(customerID, keySkillID) select 2,1 from dual where not exists ( select customerID from customer_keyskill where customerID = 2 and keySkillID = 1 )