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
dual
Debe 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?dual
hecho, 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 dual
siempre obtienes1
y siSELECT 'foo' FROM dual
siempre obtienesfoo
. Pero no puedesSELECT * FROM dual
y no puedesDESCRIBE dual
ni 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 IGNORE
que 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=123
bit es un "no-op" para que coincida con la sintaxis de laON DUPLICATE
clá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
INSERT
o no, podría simplemente establecer unaUNIQUE
clave 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 dual
anteswhere
.FROM DUAL
es 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