我可以为主键设置ignore_dup_key吗?

Mr.*_*ble 35 sql t-sql sql-server database-design sql-server-2008

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

ALTER INDEX PK_mypk on MyTable
SET (IGNORE_DUP_KEY = ON);
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

Cannot use index option ignore_dup_key to alter index 'PK_mypk' as it enforces a primary or unique constraint.

我该怎么IGNORE_DUP_KEY办?

Kva*_*asi 59

ALTER TABLE [TableName] REBUILD WITH (IGNORE_DUP_KEY = ON)
Run Code Online (Sandbox Code Playgroud)

  • 不知道.这个问题是标记的sql-server,所以尝试为PostgreSQL搜索类似的问题. (3认同)

Bra*_*adC 25

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

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

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.
Run Code Online (Sandbox Code Playgroud)

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


小智 8

删除 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
Run Code Online (Sandbox Code Playgroud)

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


gbn*_*gbn 5

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

请参阅ALTER TABLE..index 选项

指定当插入操作尝试将重复键值插入到唯一索引时的错误响应。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)
Run Code Online (Sandbox Code Playgroud)