我的表上有一个两列主键。我尝试更改它以使用以下命令将
ignore_dup_key
设置为打开:
ALTER INDEX PK_mypk on MyTable
SET (IGNORE_DUP_KEY = ON);
但我收到此错误:
Cannot use index option ignore_dup_key to alter index 'PK_mypk' as it enforces a primary or unique constraint.
我还应该如何将
IGNORE_DUP_KEY
设置为开启?
ALTER TABLE [TableName] REBUILD WITH (IGNORE_DUP_KEY = ON)
在线图书中没有记录,但我发现虽然
IGNORE_DUP_KEY
对于主键有效,但您无法使用 ALTER INDEX 更改它;您必须删除并重新创建主键。
请记住,
IGNORE_DUP_KEY
不允许您在唯一索引中实际存储重复的行,它只是改变如何当您尝试它时会失败:
ON:插入重复键值时会出现警告消息 到唯一索引中。 仅违反唯一性的行 约束将会失败。
OFF:插入重复键值时会出现错误消息 到唯一索引中。 整个INSERT操作将被滚动 回来.
删除 PK,然后重新创建它
ALTER TABLE TableName DROP CONSTRAINT PK_TableName
GO
ALTER TABLE TableName ADD CONSTRAINT PK_TableName PRIMARY KEY CLUSTERED
( MyIDColumn ASC )
WITH (IGNORE_DUP_KEY = ON) ON [PRIMARY]
GO
参见-> https://eitanblumin.com/2018/10/28/the-ignore_dup_key-option-in-primary-keys-and-unique-indexes/
它决定了仅插入重复项时会发生什么
指定当发生错误时的错误响应 插入操作尝试插入 将键值复制到唯一的值中 指数。 IGNORE_DUP_KEY 选项 仅适用于插入操作 创建或重建索引后。 该选项在以下情况下无效: 执行 CREATE INDEX、ALTER INDEX、 或更新。
..不适用于PK
ALTER TABLE 的 BOL 注释关于此和“向后兼容性”有点令人困惑。我刚刚尝试了一下,BradC 是正确的。
CREATE TABLE dbo.foo (bar int PRIMARY KEY WITH (FILLFACTOR=90, IGNORE_DUP_KEY = ON))
GO
INSERT dbo.foo VALUES (1)
GO
INSERT dbo.foo VALUES (1)
GO
--gives
(1 row(s) affected)
Duplicate key was ignored.
(0 row(s) affected)
我个人从来不希望它忽略重复项。如果主键存在重复值,则需要对其进行修复。我不希望它被忽略并插入其他记录,因为这样用户可能会认为它们都已插入。此设置是对错误插入过程的掩盖。设计良好的流程不需要此设置,因为它会在输入数据之前清理数据(或使用 upsert 更新现有数据并插入新数据)并将坏记录发送到表,以便可以修复并重新插入它们或发送错误返回给用户,以便他们知道他们的记录未被插入。
请注意,此设置仅影响您尝试插入重复键时发生的情况,它不允许您插入重复键。
如果您尝试插入重复键,您可以删除主键索引,插入记录,修复数据(删除重复项等),然后重新创建索引。