代码之家  ›  专栏  ›  技术社区  ›  TheVillageIdiot

标识列中的值重复

  •  2
  • TheVillageIdiot  · 技术社区  · 14 年前

    id Identity . 但此列包含重复的值1..8,然后是1..10

    这到底怎么可能?

    5 回复  |  直到 14 年前
        1
  •  4
  •   Tim Coker    14 年前

    除了 SET IDENTITY INSERT ,还有一个重新设定种子的命令。 DBCC CHECKIDENT 命令将您的标识值重置回您指定的值。

    假设启用标识规范实际上是从列中的最高整数开始的,可能有人使用 SET IDENTITY_INSERT .

    正如Andomar所说的,重新排序的最快方法是像这样删除/重新创建列

    ALTER TABLE tbl
    DROP COLUMN ident_column
    GO
    alter TABLE tbl
    ADD ident_column int IDENTITY
    

    设置标识\u插入 文件: http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx
    DBCC检查标识 文件: http://msdn.microsoft.com/en-us/library/aa258817(SQL.80).aspx

        2
  •  3
  •   Giorgi    14 年前

        3
  •  1
  •   Andomar    14 年前

    primary key unique 约束条件。

    标识列中的重复项可以解释为:

    • 列定义在某个时间点不包含标识缺省值(如Giorgi所说)
    • SET IDENTITY INSERT TableName ON 在某个时间点启用

        4
  •  1
  •   broadband    11 年前

    使用identity\u INSERT的identity列“RecNo”中的重复值示例:

    create table names(RecNo INT IDENTITY (1,1), name VARCHAR(50))
    insert into names(name) VALUES ('maria')
    insert into names(name) VALUES ('maria2')
    
    set IDENTITY_INSERT names ON
    insert into names(RecNo, name) VALUES (1, 'maria3')
    set IDENTITY_INSERT names OFF
    
    select * from names
    
    RecNo   name
    1           maria
    2           maria2
    1           maria3
    

    设置identity\u insert时,建议不要更改它(以允许显式值)。通过再次设置种子在标识列“RecNo”中复制值的示例:

    create table names(RecNo INT IDENTITY (1,1), name VARCHAR(50))
    insert into names(name) VALUES ('maria')
    insert into names(name) VALUES ('maria2')
    
    DBCC CHECKIDENT(names, RESEED, 1)
    insert into names(name) VALUES ('maria3')
    set IDENTITY_INSERT names OFF
    
    select * from names;
    
    RecNo   name
    1          maria
    2          maria2
    2          maria3
    
        5
  •  0
  •   HLGEM    14 年前

    如果身份与关系无关,是的,您可以删除并重新创建它。如果有关系,情况就更复杂了。

    完成后,您将这些子记录更新为新的id。然后在没有子记录的情况下删除旧的父记录。如果你(我指的是公司,不一定是程序员,有时这是只有用户才能做的)不能识别子记录指向哪个父记录,那么就删除那些子记录,然后删除旧的父记录。如果您有子记录,您不想删除,因为您需要用于成本历史报告的数据或类似的东西,然后保留一个旧的父记录。在本例中,我可能会将其中一个父记录更改为Unknown作为用户名或表中标识该记录的任何其他值,然后删除另一个重复的id。

    祝你好运,像这样的数据完整性问题很难解决。另外,我会在您的代码库中搜索短语“set indentity\u insert”,以确保没有目光短浅的程序员会避免正确使用identity字段。您不希望此问题再次发生。如果您找到了这段代码,并且知道是谁对您做了这件事(源代码管理是一件美妙的事情),我建议您最好指派他来解决任何数据完整性问题。经历过一次修复数据完整性问题的痛苦,你将来会成为一个更加谨慎的程序员。