You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将表中行复制到另一表并生成新主键的SQL问题排查

问题分析与解决方案

首先,你的SQL语句里有两个明显的问题,导致表B无法自动生成新主键:

  1. 列数量不匹配:你指定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允许为空,数据库自动补了默认值,但这完全不是你想要的效果。
  2. 多余的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:57:47