身份列是否包含重复值?

时间:2019-02-08 10:19:44

标签: sql-server

我有带标识列的表。好像标识列已重复。列包含重复值的所有可能性是什么?

表结构如下所示,

  create table Table1(ID INT identity, value varchar(10)) 

2 个答案:

答案 0 :(得分:3)

如果该列没有唯一约束,则可以在其中获得重复的值。
一种方法是像这样

SET IDENTITY_INSERT Table1 ON

INSERT INTO Table1 (ID, value)
VALUES (1, 'hello')

SET IDENTITY_INSERT Table1 OFF

另一种方法是重新放置表格,检查Satheesh的答案,以了解如何操作。

如果您不想这样做,请在此列primary key或在该列上创建一个unique constraint

如何创建唯一索引:

CREATE UNIQUE NONCLUSTERED INDEX idx_Table1_ID
ON dbo.Table1(ID)
WHERE ID IS NOT NULL;

在您的示例中,WHERE ID IS NOT NULL;是必需的,因为您允许在ID列中使用空值,我不建议

我可以肯定地确定您的桌子应该是这样

Create table Table1 (
  ID int identity not null,
  Value varchar(10),
  constraint PK_Table1_ID primary key (ID)
)

答案 1 :(得分:2)

当然,“标识列”可以具有重复值。

但是,由于值是由表本身自动填充的,因此系统不可能创建重复项。

但是您可以使用INSERT INTO语句添加Duplicate值。或者,如果您RESEED标识列而不删除现有值,则系统本身将创建重复项。

因为默认情况下没有UNIQUE约束中的“身份”列。

请参见下面的示例

CREATE TABLE Temp
(
    SeqNo INT IDENTITY(1,1),
    MyStr VARCHAR(10)
)

INSERT INTO Temp
VALUES('A')

结果

SeqNo   MyStr
1         A

SET IDENTITY_INSERT TEMP ON

INSERT INTO TEMP(SeqNo,MyStr)
VALUES(1,'B')

SET IDENTITY_INSERT TEMP OFF

结果

SeqNo   MyStr
1        A
1        B

插入几对记录

INSERT INTO TEMP
VALUES('C')

INSERT INTO TEMP
VALUES('D')

结果

SeqNo   MyStr
1        A
1        B
2        C
3        D

执行身份重新设定种子并插入新值

DBCC CHECKIDENT ('TEMP', RESEED, 1)

INSERT INTO TEMP
VALUES('E')

最终结果

SeqNo   MyStr
1        A
1        B
2        C
3        D
2        E