我可以为主键设置ignore_dup_key吗?

时间:2010-04-07 16:33:16

标签: sql sql-server sql-server-2008 tsql database-design

我在桌面上有一个双列主键。我试图改变它以使用此命令将ignore_dup_key设置为on:

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

6 个答案:

答案 0 :(得分:57)

ALTER TABLE [TableName] REBUILD WITH (IGNORE_DUP_KEY = ON)

答案 1 :(得分:22)

它没有在联机丛书中记录,但我发现虽然这对主键有效,但你不能用ALTER INDEX改变它,你必须删除并重新创建主键。 / p>

请记住,此标志不允许您实际存储重复的行,它只是更改导致的错误:

ON
A warning message will occur when duplicate key values are inserted into a unique
index. Only the rows violating the uniqueness constraint will fail.

OFF
An error message will occur when duplicate key values are inserted into a 
unique index. The entire INSERT operation will be rolled back.

来自http://msdn.microsoft.com/en-us/library/ms175132.aspx

答案 2 :(得分:4)

它确定仅插入重复项时会发生什么

请参阅ALTER TABLE..index option

  

指定时的错误响应   插入操作尝试插入   将键值重复为唯一值   指数。 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)

答案 3 :(得分:1)

删除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 = OFF) ON [PRIMARY]
GO

查看-> https://eitanblumin.com/2018/10/28/the-ignore_dup_key-option-in-primary-keys-and-unique-indexes/

答案 4 :(得分:0)

请注意,此设置仅影响尝试插入重复密钥时发生的情况,但不允许您插入重复密钥。

如果您尝试插入重复键,则可以删除主键索引,插入记录,修复数据(删除重复项等),然后重新创建索引。

答案 5 :(得分:0)

就我个人而言,我从不希望它忽略重复。如果主键有重复值,则需要修复它。我不希望它被忽略而其他记录被插入,因为用户可能会认为它们都被插入了。此设置是对错误插入过程的掩盖。设计良好的过程不需要此设置,因为它在输入数据之前清除数据(或使用upsert更新现有数据并插入新数据)并将错误记录发送到表中,以便可以修复和重新插入数据或发送错误回到用户,所以他们知道他们的记录没有插入。