DELETE后执行INSERT报错,如何实现清空表后插入?附解决方案
问题描述
我有以下两个SQL语句:
查询1:
DELETE FROM table_2;
查询2:
INSERT IGNORE INTO table_2 SELECT * from table_1;
单独执行这两个语句都没问题,但放在一起执行时会报语法错误:
DELETE FROM table_2; INSERT IGNORE INTO table_2 SELECT * from table_1; SQL Error: ... syntax error near 'INSERT IGNORE INTO table_2...
报错原因是无法在DELETE或TRUNCATE之后直接用INSERT。我现在在脚本里测试这个逻辑,之后要迁移到存储过程,想请教怎么实现先清空表再插入数据?如果推荐用UPDATE的话,具体该怎么写?
解决方案
1. 用存储过程执行(已验证可行)
正如你后续编辑提到的,把这两个语句放进存储过程里执行就不会报错了。存储过程本身支持在一个逻辑块里连续执行多条DML语句,示例代码如下:
DELIMITER // CREATE PROCEDURE RefreshTable2() BEGIN DELETE FROM table_2; INSERT IGNORE INTO table_2 SELECT * FROM table_1; END // DELIMITER ; -- 调用存储过程 CALL RefreshTable2();
2. 调整脚本执行方式
如果要在脚本里直接跑,得确保你的SQL客户端支持批量执行多语句,或者开启了多语句执行模式。另外,也可以用TRUNCATE TABLE替代DELETE,它清空表的效率更高,同样能和INSERT配合使用(注意TRUNCATE会重置表的自增ID):
TRUNCATE TABLE table_2; INSERT IGNORE INTO table_2 SELECT * FROM table_1;
UPDATE替代方案(针对无需全量清空的场景)
如果你的业务场景不需要全量清空table_2,只是要同步table_1的数据,可以用以下两种方式替代:
- REPLACE INTO:会删除主键/唯一索引冲突的行,再插入新数据,需要表有主键或唯一索引:
REPLACE INTO table_2 SELECT * FROM table_1;
- INSERT ... ON DUPLICATE KEY UPDATE:更灵活,可指定冲突时要更新的字段:
INSERT INTO table_2 SELECT * FROM table_1 ON DUPLICATE KEY UPDATE col1 = VALUES(col1), col2 = VALUES(col2), -- 其他需要更新的字段依次列出 coln = VALUES(coln);
编辑(已解决)
之前在脚本里执行会报错,把代码放进存储过程里执行就没问题了。
内容的提问来源于stack exchange,提问作者Strovic
相关产品推荐
相关产品推荐

