如何将表数据复制到开头含自增列的目标表?
可行解决方案
方法1:指定目标表的非自增列(推荐)
明确列出目标表starchive中除开头自增列之外的所有列,确保顺序和源表stflagged的列完全对应,数据库会自动为自增列生成值:
INSERT INTO `starchive` (列名1, 列名2, 列名3) -- 替换为starchive中除自增列外的所有列 SELECT f.* FROM `stflagged` f;
方法2:在SELECT开头补充自增列的占位值
因为自增列在目标表开头,需要在SELECT语句最前面加上NULL或DEFAULT,让数据库自动填充自增值,注意语法正确:
-- 使用NULL占位 INSERT INTO `starchive` SELECT NULL, f.* FROM `stflagged` f; -- 或者使用DEFAULT占位 INSERT INTO `starchive` SELECT DEFAULT, f.* FROM `stflagged` f;
为什么之前的语句失败
你之前的写法INSERT INTO starchive null, SELECT f.*存在语法错误,正确格式应为INSERT INTO 表名 SELECT ...(SELECT列数需匹配目标表总列数),或INSERT INTO 表名 (列列表) SELECT ...,不能在表名后直接写null,。
注意事项
- 确保源表
stflagged的列数 +1(自增列)等于目标表starchive的总列数,列顺序也要对应。 - 用
0替代的话,需确认数据库未开启NO_AUTO_VALUE_ON_ZERO模式,否则0会被当作实际值插入而非触发自增,因此NULL或DEFAULT是更稳妥的选择。
内容的提问来源于stack exchange,提问作者Chiwda
相关产品推荐
相关产品推荐

