sql - 在一个查询中插入多个表

yos*_*ssi 32 mysql sql multiple-tables insert-into

假设我有两个表,names并且phones 我想将一些输入的数据插入到表中,在一个查询中 - 如何才能完成?

如果可以,请解释语法.

Jos*_*ith 63

你不能.但是,您可以使用事务并将它们都包含在一个事务中.

START TRANSACTION;
INSERT INTO table1 VALUES ('1','2','3');
INSERT INTO table2 VALUES ('bob','smith');
COMMIT;
Run Code Online (Sandbox Code Playgroud)

http://dev.mysql.com/doc/refman/5.1/en/commit.html

  • @Clox:这部分是交易的目的.另一个目的是数据库在事务之前,期间和之后处于已知的稳定状态.这意味着并发查询永远不会看到部分提交的数据. (3认同)
  • 干杯的约书亚,这对我很有帮助。尽管在MySql中,我认为这是START而不是BEGIN。 (2认同)
  • 交易的目的是什么?我收集到,如果其中一个查询出现问题,那么所有查询都将被回滚.是吗?或者是否也有一些性能提升? (2认同)

OMG*_*ies 19

MySQL不支持在单个INSERT语句中插入多表.奇怪的是,甲骨文是唯一一个我知道的东西.

INSERT INTO NAMES VALUES(...)
INSERT INTO PHONES VALUES(...)
Run Code Online (Sandbox Code Playgroud)

  • 约书亚史密斯的回答比这个更好. (8认同)

dmi*_*kam 8

老问题,但万一有人发现它有用......在 Posgresql、MariaDB 和可能 MySQL 8+ 中,您可能会在不使用WITH语句进行事务的情况下实现相同的目标。

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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,与事务相比,这种技术没有太多优势,但作为一种选择......或者如果您的系统由于某种原因不支持事务......

PS 我知道这是一个 Postgresql 示例,但看起来 MariaDB 完全支持此类查询。在 MySQL 中,我想你可能只使用 LAST_INSERT_ID() 而不是 RETURNING * 和一些小的调整。