我可以为主键设置ignore_dup_key吗?

问题描述 投票:0回答:6

我的表上有一个两列主键。我尝试更改它以使用以下命令将

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
设置为开启?

sql sql-server sql-server-2008 t-sql database-design
6个回答
73
投票
ALTER TABLE [TableName] REBUILD WITH (IGNORE_DUP_KEY = ON)

35
投票

在线图书中没有记录,但我发现虽然

IGNORE_DUP_KEY
对于主键有效,但您无法使用 ALTER INDEX 更改它;您必须删除并重新创建主键。

请记住,

IGNORE_DUP_KEY
不允许您在唯一索引中实际存储重复的行,它只是改变如何当您尝试它时会失败:

ON:插入重复键值时会出现警告消息 到唯一索引中。 仅违反唯一性的行 约束将会失败

OFF:插入重复键值时会出现错误消息 到唯一索引中。 整个INSERT操作将被滚动 回来.

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


6
投票

删除 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/


5
投票

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

参见 ALTER TABLE..index 选项

指定当发生错误时的错误响应 插入操作尝试插入 将键值复制到唯一的值中 指数。 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)

1
投票

我个人从来不希望它忽略重复项。如果主键存在重复值,则需要对其进行修复。我不希望它被忽略并插入其他记录,因为这样用户可能会认为它们都已插入。此设置是对错误插入过程的掩盖。设计良好的流程不需要此设置,因为它会在输入数据之前清理数据(或使用 upsert 更新现有数据并插入新数据)并将坏记录发送到表,以便可以修复并重新插入它们或发送错误返回给用户,以便他们知道他们的记录未被插入。


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.