Insertar en varias tablas en una consulta
Suponiendo que tengo dos tablas names
y phones
quiero insertar datos de alguna entrada en las tablas, en una consulta. ¿Cómo puede hacerse esto?
No puedes. Sin embargo, PUEDES usar una transacción y hacer que ambas estén contenidas en una sola transacción.
START TRANSACTION;
INSERT INTO table1 VALUES ('1','2','3');
INSERT INTO table2 VALUES ('bob','smith');
COMMIT;
http://dev.mysql.com/doc/refman/5.1/en/commit.html
MySQL no admite la inserción de varias tablas en una única instrucción INSERT . Oracle es el único que yo sepa que lo hace, curiosamente...
INSERT INTO NAMES VALUES(...)
INSERT INTO PHONES VALUES(...)
Antigua pregunta, pero en caso de que alguien la encuentre útil... En Posgresql, MariaDB y probablemente MySQL 8+ puedes lograr lo mismo sin transacciones usando la declaración CON.
WITH names_inserted AS (
INSERT INTO names ('John Doe') RETURNING *
), phones_inserted AS (
INSERT INTO phones (id_name, phone) (
SELECT names_inserted.id, '123-123-123' as phone
) RETURNING *
) SELECT * FROM names_inserted
LEFT JOIN phones_inserted
ON
phones_inserted.id_name=names_inserted.id
Esta técnica no tiene muchas ventajas en comparación con las transacciones en este caso, pero como opción... o si su sistema no admite transacciones por algún motivo...
PD: Sé que este es un ejemplo de Postgresql, pero parece que MariaDB tiene soporte completo para este tipo de consultas. Y en MySQL supongo que puedes usar LAST_INSERT_ID() en lugar de RETURNING * y algunos ajustes menores.
Yo tuve el mismo problema. Lo soluciono con un bucle for.
Ejemplo:
Si quiero escribir en 2 tablas idénticas , usando un bucle
for x = 0 to 1
if x = 0 then TableToWrite = "Table1"
if x = 1 then TableToWrite = "Table2"
Sql = "INSERT INTO " & TableToWrite & " VALUES ('1','2','3')"
NEXT
cualquiera
ArrTable = ("Table1", "Table2")
for xArrTable = 0 to Ubound(ArrTable)
Sql = "INSERT INTO " & ArrTable(xArrTable) & " VALUES ('1','2','3')"
NEXT
Si tiene una consulta pequeña, no sé si esta es la mejor solución, pero si su consulta es muy grande y está dentro de un script dinámico con condiciones if/else/case, esta es una buena solución.