我的一个表有一个由两列组成的主键。我尝试使用以下命令将其更改为将ignore_dup_key
设置为开启:
ALTER INDEX PK_mypk on MyTable
SET (IGNORE_DUP_KEY = ON);
但我遇到了这个错误:
无法使用索引选项 ignore_dup_key 来更改索引 'PK_mypk',因为它强制执行主键或唯一约束条件。
我应该如何打开IGNORE_DUP_KEY
呢?
我的一个表有一个由两列组成的主键。我尝试使用以下命令将其更改为将ignore_dup_key
设置为开启:
ALTER INDEX PK_mypk on MyTable
SET (IGNORE_DUP_KEY = ON);
但我遇到了这个错误:
无法使用索引选项 ignore_dup_key 来更改索引 'PK_mypk',因为它强制执行主键或唯一约束条件。
我应该如何打开IGNORE_DUP_KEY
呢?
ALTER TABLE [TableName] REBUILD WITH (IGNORE_DUP_KEY = ON)
《Books Online》没有提供文档,但我发现虽然IGNORE_DUP_KEY
适用于主键,但您无法通过ALTER INDEX更改它; 您需要删除并重新创建主键。
请记住,IGNORE_DUP_KEY
不能实际上在唯一索引中存储重复的行,它只是更改了在尝试时失败的方式:
开启(ON):当插入重复键值时,将出现警告消息到唯一索引。 仅违反唯一性约束的行将失败。
关闭(OFF): 当插入重复键值时,将出现错误消息到唯一索引。 整个INSERT操作将回滚。
删除主键,然后重新创建
ALTER TABLE TableName DROP CONSTRAINT PK_TableName
GO
ALTER TABLE TableName ADD CONSTRAINT PK_TableName PRIMARY KEY CLUSTERED
( MyIDColumn ASC )
WITH (IGNORE_DUP_KEY = OFF) 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或UPDATE时没有影响。
..并且不适用于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)
IGNORE_DUP_KEY
的性能远不如使用 WHERE NOT EXISTS
,所以请务必自行检查。 - CWagner