mysql:有没有办法做一个“INSERT INTO”2表?

时间:2011-02-01 06:52:51

标签: sql mysql

我有一个包含2列的表,我基本上想要拆分为2个表:

表A列:user_id,col1,col2

新表:

B:u​​ser_id,col1

C:user_id,col2

我想这样做:

INSERT INTO B (user_id, col1) SELECT user_id,col1 from A;
INSERT INTO C (user_id,col2) SELECT user_id, col2 from A;

但我想在一个声明中这样做。表很大,所以我只想一次性完成。有没有办法做到这一点?

THX。

4 个答案:

答案 0 :(得分:1)

不,您不能同时插入多个表。 INSERT语法只允许使用一个表名。

http://dev.mysql.com/doc/refman/5.5/en/insert.html

  

INSERT [LOW_PRIORITY |延迟|   HIGH_PRIORITY] [IGNORE] [INTO]    tbl_name [...

答案 1 :(得分:1)

编写存储过程以封装两个插入并保护事务。

答案 2 :(得分:1)

如果通过“在一个声明中”,你的意思是“原子地” - 这样就不会发生它被插入到一个表而不是另一个表中 - 那么交易是你正在寻找的:

START TRANSACTION;
INSERT INTO B (user_id, col1) SELECT user_id,col1 from A;
INSERT INTO C (user_id,col2) SELECT user_id, col2 from A;
COMMIT;

如果您需要在单个语句中实际执行此操作,则可以将其创建为存储过程,并按@lexu建议调用它。

请参阅手册以供参考:http://dev.mysql.com/doc/refman/5.0/en/commit.html

警告:这不适用于MyISAM表(没有事务支持),它们需要是InnoDB。

答案 3 :(得分:0)

除非您的表分布在多个物理磁盘上,否则select / insert的速度很可能是IO绑定的。

尝试一次插入两个表(即使可能)可能会增加总插入时间,因为磁盘必须更多地写入表。