我有一个包含2列的表,我基本上想要拆分为2个表:
表A列:user_id,col1,col2
新表:
B:user_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。
答案 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绑定的。
尝试一次插入两个表(即使可能)可能会增加总插入时间,因为磁盘必须更多地写入表。