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?
Respuestas:
No estoy sugiriendo que hagas esto, ya que el
UNIQUE
índice sugerido por Piskvor y otros es una forma mucho mejor de hacerlo, pero puedes hacer lo que estabas intentando:Insertar un registro:
Intente insertar el mismo registro nuevamente:
Insertar un registro diferente:
Y así...
Actualizar:
Para evitar
#1060 - Duplicate column name
errores en caso de que dos valores sean iguales, debe nombrar las columnas del SELECT interno:fuente
name
, en este caso), si es posible. Tenga en cuenta también que puede hacerloSELECT 'John', 'Doe', '022' FROM table_listnames
, en lugar deSELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
, pero eso solo funcionará sitable_listnames
ya contiene una o más filas. Sin embargo, dudo que la velocidad sea diferente, por lo que probablemente no sea una preocupación.WHERE
declaración pertenece a laSELECT
consulta. La consulta Seleccionar devuelve una sola fila de datos (se insertan datos) o no hay datos (no se inserta nada)SELECT 'Humbert', 'Humbert', '1'
en la selección interna). ReciboERROR 1060 (42S21): Duplicate column name
#1060 - Duplicate column name
. ¿Has encontrado una solución? Editar: lo encontré. Agregue detrás de cada valor un AS:SELECT * FROM (SELECT 'Rupert' as name, 'Rupert' as friend, '022' as number) AS tmp
INSERT no permite
WHERE
en la sintaxis .Lo que puede hacer: cree un
UNIQUE INDEX
campo que debe ser único (name
), luego use:INSERT
(y maneje 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áUPDATE
al final si el nombre ya existe, consulte la documentación )fuente
mysql> show warnings\G
INSERT IGNORE
, coincide con la expresión regular de^Duplicate entry '.+' for key '.+'$
INSERT IGNORE
IMO.Trabajó :
fuente
MySQL proporciona una solución muy linda:
Muy fácil de usar ya que ha declarado una clave primaria única (aquí con valor 5).
fuente
Aquí la consulta mysql, que inserta registros si no existen e ignorará los registros similares existentes.
fuente
INSERT IGNORE INTO `mytable` (`field0`, `field1`, `field2`) values ('2', 12345, 12678);
?INSERT [...] IGNORE INTO mytable VALUES ...
OINSERT [...] IGNORE INTO mytable SET col_name={expr | DEFAULT},...
Puede usar fácilmente la siguiente manera:
De esta manera, puede insertar cualquier nueva materia prima y, si tiene datos duplicados, reemplace la columna específica (las mejores columnas son las marcas de tiempo).
Por ejemplo :
fuente
Si realmente no puede obtener un índice único en la tabla, puede intentar ...
fuente
Para superar un problema similar, he modificado la tabla para tener una columna única. Usando su ejemplo, en la creación tendría algo como:
y luego use la siguiente consulta al insertarlo:
fuente
Esta consulta funciona bien:
Y puede crear la tabla usando la siguiente consulta:
Nota: Cree una tabla usando la segunda consulta antes de intentar usar la primera consulta.
fuente
Brian Hooper: Casi llegas al punto pero tienes un error en tu synatx. Su inserto nunca funcionará. Probé en mi base de datos y aquí está la respuesta correcta:
Te estoy dando mi ejemplo de y mesa. Insertar es casi lo mismo que escribió Bian Hooper, excepto que puse el select FROM DUAL en otra tabla. Saludos cordiales, Ivan
fuente
unknown table status: TABLE_TYPE
mensajes, aunque la consulta arrojó un resultado. ¿Probablemente porque MySQL no requiere laFROM DUAL
cláusula?fuente
Estás insertando no actualizando el resultado. Puede definir la columna de nombre en la columna primaria o establecerla como única.
fuente
Tuve un problema, y el método que Mike aconsejó funcionó en parte, tuve un error Dublicate Column name = '0', y cambié la sintaxis de su consulta como esta`
El problema fue con los nombres de columna. sum3 era igual a sum4 y mysql arrojó nombres de columna duplicados, y escribí el código en esta sintaxis y funcionó perfectamente,
fuente
Tuve un problema similar y necesitaba insertar múltiples si no existía. Entonces, a partir 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 también funciona con *.
MySQL: CREATE TABLE
names
(OID
int (11) NOT NULL AUTO_INCREMENT,name
varchar (32) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (OID
), UNIQUE KEYname_UNIQUE
(name
)) ENGINE = InnoDB AUTO_INCREMENT = 1;o
MSSQL: CREATE TABLE [nombres] ([OID] IDENTIFICACIÓN INT (1, 1) NO NULL, [nombre] NVARCHAR (32) NO NULL, CLAVE PRIMARIA CLUSIFICADA ([OID] ASC)); CREAR ÍNDICE ÚNICO NO AGRUPADO [Index_Names_Name] ON [nombres] ([nombre] ASC);
fuente
Esta consulta se puede usar en código PHP.
Tengo una columna de ID en esta tabla, así que necesito verificar la duplicación de todas las columnas, excepto esta columna de ID:
y ahora se agregará un nuevo elemento solo en caso de que no exista una fila con valores configurados en
SET
cadenafuente