Estoy teniendo dificultades para formar un INSERT condicional
Tengo x_table con columnas (instancia, usuario, elemento) donde el ID de instancia es único. Quiero insertar una nueva fila solo si el usuario ya no tiene un elemento determinado.
Por ejemplo, intentando insertar instancia = 919191 usuario = 123 elemento = 456
Insert into x_table (instance, user, item) values (919191, 123, 456)
ONLY IF there are no rows where user=123 and item=456
Cualquier ayuda u orientación en la dirección correcta será muy apreciada.
fuente

dualDebe crearse de antemano en este caso o es algún tipo de tabla "temporal" especial creada por la consulta para el uso de la consulta solamente?dualhecho, debe crearlo.CREATE TABLE dual ( dummy CHAR(1) DEFAULT 'x' NOT NULL CHECK (dummy = 'x') PRIMARY KEY ); INSERT INTO dual VALUES('x'); REVOKE ALL ON dual FROM PUBLIC; GRANT SELECT ON dual TO PUBLIC;SELECT COUNT(*) FROM dualsiempre obtienes1y siSELECT 'foo' FROM dualsiempre obtienesfoo. Pero no puedesSELECT * FROM dualy no puedesDESCRIBE dualni nada por el estilo. No lo he comprobado, pero tampoco creo que puedas revocar los permisosdual. Así que vale la pena señalar que funciona como esperas ... excepto cuando no lo hace;)También puede usar
INSERT IGNOREque ignora silenciosamente la inserción en lugar de actualizar o insertar una fila cuando tiene un índice único en (usuario, elemento).La consulta se verá así:
Puede agregar el índice único con
CREATE UNIQUE INDEX user_item ON x_table (user, item).fuente
¿Alguna vez has probado algo así?
fuente
Con a
UNIQUE(user, item), haz:el
user=123bit es un "no-op" para que coincida con la sintaxis de laON DUPLICATEcláusula sin hacer nada cuando hay duplicados.fuente
En caso de que no desee establecer una restricción única, esto funciona como un encanto:
Espero eso ayude !
fuente
Lo que quieres es
INSERT INTO table (...) SELECT ... WHERE .... del manual de MySQL 5.6 .En tu caso es:
O tal vez, dado que no está utilizando ninguna lógica complicada para determinar si ejecutar
INSERTo no, podría simplemente establecer unaUNIQUEclave en la combinación de estas dos columnas y luego usarINSERT IGNORE.fuente
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where...(ejecutando 5.6.34)from dualanteswhere.FROM DUALes el valor predeterminado si no se hizo referencia a tablas ( consulte esta documentación ).Si agrega una restricción que (x_table.user, x_table.item) es única, la inserción de otra fila con el mismo usuario y elemento fallará.
p.ej:
fuente
Aunque es bueno verificar la duplicación antes de insertar sus datos, le sugiero que coloque una restricción / índice único en sus columnas para que no se puedan insertar datos duplicados por error.
fuente
Puede utilizar la siguiente solución para resolver su problema:
fuente
Ligera modificación a la respuesta de Alex, también puede hacer referencia al valor de columna existente:
fuente
Entonces este representa PostgreSQL
fuente
La sintaxis puede variar dependiendo de su base de datos ...
fuente