我有带标识列的表。好像标识列已重复。列包含重复值的所有可能性是什么?
表结构如下所示,
create table Table1(ID INT identity, value varchar(10))
答案 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