基于过期日期迁移SQL数据遇主键冲突,需自动分配主键值
解决SQL数据迁移时的主键冲突问题
问题原因
你开启了IDENTITY_INSERT,强制将源表的主键值插入目标表,但目标表dbo.ClerkDogHistory中已存在主键值10595,触发了主键约束冲突。要让SQL自动分配主键,需关闭IDENTITY_INSERT,且插入时不指定主键列。
修正后的SQL代码
BEGIN TRANSACTION; -- 明确列出目标表中除主键外的所有列,与源表对应字段一一匹配 INSERT INTO [Table_records_are_being_moved_TO] (column2, column3, ...) SELECT column2, column3, ... FROM [Table_records_are_being_moved_FROM] WHERE [expiration_date] BETWEEN '2013-01-01' AND '2013-12-31'; DELETE FROM [Table_records_are_being_moved_FROM] WHERE [expiration_date] BETWEEN '2013-01-01' AND '2013-12-31'; COMMIT;
关键调整说明
- 移除
SET IDENTITY_INSERT ... ON/OFF:目标表主键为自增类型时,无需手动插入主键值,数据库会自动分配唯一值 - 避免使用
SELECT *:明确指定要插入的列,确保与目标表列顺序、类型完全匹配,同时排除主键列 - 保留事务:保证插入和删除操作的原子性,防止出现数据迁移不完整的情况
额外注意事项
- 确认目标表的主键列已设置为**自增(IDENTITY)**属性
- 执行前先单独运行
SELECT语句,核对要迁移的数据是否正确 - 若需回滚操作,可将
COMMIT替换为ROLLBACK进行测试
内容的提问来源于stack exchange,提问作者tcoady
相关产品推荐
相关产品推荐

