varios una tablas tabla relacionadas registros insertar ejemplos desde datos crear consultas mysql sql sql-insert

mysql - una - Insertar SQL en la tabla solo si el registro no existe



insertar datos en una tabla sql (3)

Esta pregunta ya tiene una respuesta aquí:

Quiero ejecutar un conjunto de consultas para insertar algunos datos en una tabla SQL, pero solo si se cumple el registro que cumple ciertos criterios. La tabla tiene 4 campos: id (primario), fund_id , date y price

Tengo 3 campos en la consulta: fund_id , date y price .

Entonces mi consulta sería algo como esto:

INSERT INTO funds (fund_id, date, price) VALUES (23, ''2013-02-12'', 22.43) WHERE NOT EXISTS ( SELECT * FROM funds WHERE fund_id = 23 AND date = ''2013-02-12'' );

Entonces, solo quiero insertar los datos si un registro que coincida con el fund_id y la date no existe. Si lo anterior es correcto, me parece una forma bastante ineficaz de lograr esto, ya que se debe ejecutar una declaración de selección adicional cada vez.

¿Hay una mejor manera de lograr lo anterior?

Editar: para aclarar, ni fund_id ni date son campos únicos; los registros que comparten el mismo fecha_fondo o fecha existirán, pero ningún registro debe tener el mismo valor_fondo y la misma fecha que otro.


Aunque la respuesta que marqué originalmente como correcta es correcta y logro lo que solicité, hay una forma mejor de hacerlo (que otros reconocieron pero no incluyeron). Se debe crear un índice compuesto único en la tabla que conste de fund_id y date .

ALTER TABLE funds ADD UNIQUE KEY `fund_date` (`fund_id`, `date`);

Luego, al insertar un registro, agregue la condición cuando se encuentre un conflicto:

INSERT INTO funds (`fund_id`, `date`, `price`) VALUES (23, DATE(''2013-02-12''), 22.5) ON DUPLICATE KEY UPDATE `price` = `price`; --this keeps the price what it was (no change to the table) or: INSERT INTO funds (`fund_id`, `date`, `price`) VALUES (23, DATE(''2013-02-12''), 22.5) ON DUPLICATE KEY UPDATE `price` = 22.5; --this updates the price to the new value

Esto proporcionará un rendimiento mucho mejor a una sub consulta y la estructura de la tabla es superior. Viene con la advertencia de que no puede tener valores NULOS en sus columnas clave únicas ya que todavía son tratadas como valores por MySQL.


Esta podría ser una solución simple para lograr esto:

INSERT INTO funds (ID, date, price) SELECT 23, DATE(''2013-02-12''), 22.5 FROM dual WHERE NOT EXISTS (SELECT 1 FROM funds WHERE ID = 23 AND date = DATE(''2013-02-12''));

ps alternativamente (si ID una clave principal):

INSERT INTO funds (ID, date, price) VALUES (23, DATE(''2013-02-12''), 22.5) ON DUPLICATE KEY UPDATE ID = 23; -- or whatever you need

mira este violín


Suponiendo que no puede modificar DDL (para crear una restricción única) o que solo puede escribir DML, busque un resultado nulo en el filtrado de sus valores en comparación con la tabla completa

FIDDLE

insert into funds (ID, date, price) select T.* from (select 23 ID, ''2013-02-12'' date, 22.43 price) T left join funds on funds.ID = T.ID and funds.date = T.date where funds.ID is null