我在桌面上有一个双列主键。我试图改变它以使用此命令将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
?
答案 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.
答案 2 :(得分:4)
它确定仅插入重复项时会发生什么
指定时的错误响应 插入操作尝试插入 将键值重复为唯一值 指数。 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更新现有数据并插入新数据)并将错误记录发送到表中,以便可以修复和重新插入数据或发送错误回到用户,所以他们知道他们的记录没有插入。