将表中行复制到另一表并生成新主键的SQL问题排查
问题分析与解决方案
首先,你的SQL语句里有两个明显的问题,导致表B无法自动生成新主键:
- 列数量不匹配:你指定
INSERT INTO tableB (col2, col3, col4)要插入3个列,但SELECT NULL, tableA.col2, tableA.col3, tableA.col4却返回了4个字段。这种情况下数据库会把NULL赋值给col2,然后把tableA.col2对应到col3,tableA.col3对应到col4,剩下的tableA.col4没地方匹配——如果没报错,大概率是你的表B中col1允许为空,数据库自动补了默认值,但这完全不是你想要的效果。 - 多余的
NULL与表名笔误:你希望col1自动生成主键,根本不需要在SELECT里给它传值;另外你WHERE条件里写的tableAD.col1应该是笔误,正确的表名是tableA。
修正后的SQL语句
INSERT INTO tableB (col2, col3, col4) SELECT tableA.col2, tableA.col3, tableA.col4 FROM tableA WHERE tableA.col1 = xxx;
额外必查事项
要确保tableB的col1确实设置了自动生成主键的属性:
- MySQL:
col1 INT PRIMARY KEY AUTO_INCREMENT - PostgreSQL:
col1 SERIAL PRIMARY KEY或col1 INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY - SQL Server:
col1 INT PRIMARY KEY IDENTITY(1,1)
只要col1是自动生成主键类型,且你不在INSERT语句中显式指定它的值,数据库就会自动为新行生成唯一主键。
内容的提问来源于stack exchange,提问作者JohnG
相关产品推荐
相关产品推荐

