2010-04-07 147 views
26

我有一个表上的两列主键。我试图改变它与此命令设置的ignore_dup_key到:我可以为主键设置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上?

回答

21

它没有在Books Online中记录,但是我发现虽然这对主键有效,但不能用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. 

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

3

它决定了当您插入重复的只有

ALTER TABLE..index option

Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. The option has no effect when executing CREATE INDEX, ALTER INDEX, or 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) 
0

请注意,此设置只影响如果您尝试插入重复键会发生什么,它不会允许你插入重复键。

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

0

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

+2

我的问题是这样的:我需要每天插入大量的记录,我目前正在为每条记录做插入命令。如果记录已经存在,那么它会被忽略(通过抛出一个重复的键错误)。从性能POV中,最好尝试插入并允许一些插入失败,而不是在插入之前检查记录是否存在。 提高性能的下一步是使用SqlBulkCopy为每条记录执行插入而不是单个命令。但是如果任何记录存在,如果ignore_dup_key关闭,整个批次失败,则这是不可能的。 – 2010-04-07 22:56:31

+0

如果我的主键上的某一列是用户定义的呢?如果我需要同时支持多个实体的插入,比如说1000?如何在插入之前验证所有条目是唯一的,而不会对服务器产生严重影响?我认为在这种情况下,忽略重复选项非常合适。你不同意吗? – julealgon 2015-06-26 14:05:29

+0

是的,如果你忽略了重复项,并且你不愿意,你就不会主键;如果你是主键,那么你最终会遇到一个带有坏数据的世界。将数据放入临时表中然后使用select语句只插入新记录是一种更好的做法。我们以这种方式插入了百万条记录。 – HLGEM 2015-06-26 15:15:49

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

它不适用于Postgresql - 9.5 PSQL不理解关键字IGNORE_DUP_KEY。有什么办法让它(或类似的东西)在Postgresql中工作> = 9.5 – Bhindi 2017-08-01 07:47:42

+0

不知道。这个问题被标记为sql-server,因此请尝试搜索PostgreSQL的类似问题。 – Kvasi 2017-08-07 09:22:08

相关问题