我有一个由第三方应用程序生成的带有一个 PK 约束的表 MYTABLE:
CREATE TABLE [dbo].[mytable](
[ID] [int] IDENTITY(1,1) NOT NULL,
[FIELD_A] [nvarchar](255) NOT NULL,
[FIELD_B] [tinyint] NOT NULL,
CONSTRAINT [mytable_PK] PRIMARY KEY CLUSTERED ( [ID] ASC ) WITH (
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY],
UNIQUE NONCLUSTERED ( [FIELD_A] ASC ) WITH (
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
数据非常简单:
ID FIELD_A FIELD_B
1 abc 0
2 dfgh 0
3 foo 0
我正在尝试使用数据导入将此数据导入另一个数据库中此表的空副本(使用生成脚本向导/以上 ddl 创建),但出现以下错误:
"Violation of PRIMARY KEY constraint 'mytable_PK'. Cannot insert duplicate key in object 'dbo.mytable'"
我尝试了以下方法(以验证这不是重复的问题):
- 检查目标中是否没有实际重复:目标为空
- 启用选项“启用身份插入”(如果禁用,则会失败
Violation of FOREIGN KEY...
) - 尝试使用“删除现有行”和“追加”
- 禁用约束检查:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
- 尝试不导入代理 ID - 这失败,因为导入向导将字段设置为
null
如果忽略而不是留空。 - 检查可能创建重复插入的触发器
- 强制 SSMS 只删除并重新创建表
我还能检查什么来解决这个问题?
从缩小范围开始。只有这张桌子会发生这种情况吗?如果您使用脚本选项怎么办(仍然只做这个表);取消选中“一切”。等等。直到你有一些东西工作,然后重新添加一些零碎的东西,直到你找到哪一个破坏了它。
最后,这要么是向导中的问题(因为当您拥有唯一索引时,源数据中不会出现重复),或者我们没有完整的故事(因此我建议缩小范围)。
如果是向导中的问题,请考虑将其报告给 MS。他们可能会想要重现您的问题。
这最终成为一个错误(?),
SQL Server Native Client 11.0
同时使用数据源和目标。我将数据源更改为使用OLE DB Driver for SQL Server
,并且使用 Enable ID insert 可以正常工作。作为参考,我的情况是: