sql - try - ¿Cómo puedo hacer un inserto donde no existe?
title tag html (4)
Me gustaría combinar una consulta de inserción con un "donde no exista" para no violar las restricciones de PK. Sin embargo, una sintaxis como la siguiente me da una Incorrect syntax near the keyword ''WHERE''
error Incorrect syntax near the keyword ''WHERE''
:
INSERT INTO myTable(columns...)
VALUES(values...)
WHERE NOT EXISTS
(SELECT *
FROM myTable
WHERE pk_part1 = value1,
AND pk_part2 = value2)
¿Cómo puedo lograr esto?
(En general, ¿puede combinar un inserto con una cláusula where?)
La forma más sencilla de mantener una lista única de valores es a) establecer la (s) columna (s) como clave principal o b) crear una restricción única en la (s) columna (s). Cualquiera de estos podría dar como resultado un error al intentar insertar / actualizar valores a algo que ya existe en la tabla, cuando un NOT EXISTS / etc fallaría de forma silenciosa, sin errores, la consulta se ejecutará correctamente.
Dicho esto, use INSERT / SELECT (no incluya la parte de VALUES):
INSERT INTO myTable(columns...)
SELECT [statically defined values...]
FROM ANY_TABLE
WHERE NOT EXISTS (SELECT NULL
FROM myTable
WHERE pk_part1 = value1
AND pk_part2 = value2)
Ninguno de los ejemplos funcionó para mí ... así que sugiero este ejemplo:
INSERT INTO database_name.table_name(column_name)
SELECT column_name
FROM database_name.table_name
WHERE NOT EXISTS (SELECT NULL
FROM database_name.table_name
WHERE column_name = ''Column Value'')
mysql tiene la inserción de ignorar consulta:
Si utiliza la palabra clave IGNORE, los errores que se producen al ejecutar la instrucción INSERT se tratan como advertencias. Por ejemplo, sin IGNORE, una fila que duplica un índice UNIQUE o un valor de CLAVE PRINCIPAL existente en la tabla provoca un error de clave duplicada y la instrucción se cancela. Con IGNORE, la fila aún no se inserta, pero no se emite ningún error. Las conversiones de datos que podrían provocar errores abortan la declaración si no se especifica IGNORE. Con IGNORE, los valores no válidos se ajustan a los valores más cercanos y se insertan; Se producen advertencias pero la declaración no se cancela. Puede determinar con la función de la API C de mysql_info () cuántas filas se insertaron realmente en la tabla.
http://dev.mysql.com/doc/refman/5.0/en/insert.html
ACTUALIZACIÓN DE CLAVE DUPLICADA también está disponible
INSERT INTO myTable(columns...)
Select values...
WHERE NOT EXISTS
(SELECT *
FROM myTable
WHERE pk_part1 = value1,
AND pk_part2 = value2)
Edit: Después de leer el enlace de martins, si admitimos, que la mejor solución es:
BEGIN TRY
INSERT INTO myTable(columns...)
values( values...)
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH;