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
(quefallará silenciosamentecausará una advertencia (en lugar de error) si el nombre ya existe) -
INSERT ... ON DUPLICATE KEY UPDATE
(que ejecutará laUPDATE
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 )