代码之家  ›  专栏  ›  技术社区  ›  Mr. Flibble

我可以为主键设置“忽略重复”键吗?

  •  31
  • Mr. Flibble  · 技术社区  · 14 年前

    我在一张表上有一个两列主键。我试图改变它来设置 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 打开?

    5 回复  |  直到 7 年前
        1
  •  22
  •   BradC    14 年前

    它没有在网上的书籍中记录,但是我发现,虽然这对主键有效,但是不能用alter索引更改它,您必须删除并重新创建主键。

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

    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
  •  54
  •   Oleksandr Fedorenko    10 年前
    ALTER TABLE [TableName] REBUILD WITH (IGNORE_DUP_KEY = ON)
    
        3
  •  4
  •   gbn    14 年前

    它确定只插入重复项时会发生什么情况

    ALTER TABLE..index option

    指定当 插入操作尝试插入 将键值复制到唯一的 索引。忽略重复键选项 仅适用于插入操作 在创建或重建索引之后。 当 正在执行创建索引、更改索引, 或更新。

    …不适用于pks

    alter表的bol注释关于这个和“向后兼容性”有点令人困惑。我刚试过,布拉德克是对的。

    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)
    
        4
  •  0
  •   HLGEM    14 年前

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

        5
  •  0
  •   Marcus Adams    7 年前

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

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