Insertar en varias tablas en una consulta

Resuelto yossi asked hace 14 años • 6 respuestas

Suponiendo que tengo dos tablas namesy phonesquiero insertar datos de alguna entrada en las tablas, en una consulta. ¿Cómo puede hacerse esto?

yossi avatar Oct 05 '10 08:10 yossi
Aceptado

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

Joshua Smith avatar Oct 05 '2010 01:10 Joshua Smith

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(...)
OMG Ponies avatar Oct 05 '2010 01:10 OMG Ponies

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.

dmikam avatar Jul 09 '2021 08:07 dmikam

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.

Oscar Zarrus avatar May 02 '2013 07:05 Oscar Zarrus