Sql server SQL Server标识列插入失败
嗨,伙计们,我有一个简单的问题: 当insert语句在标识列上失败时会发生什么情况 例如,如果我插入一个带有标识列的行,该标识列将为1,然后再次插入,但会失败,并且不会插入和数据。然后再次尝试插入,该行的标识现在是3 任何建议都将不胜感激Sql server SQL Server标识列插入失败,sql-server,Sql Server,嗨,伙计们,我有一个简单的问题: 当insert语句在标识列上失败时会发生什么情况 例如,如果我插入一个带有标识列的行,该标识列将为1,然后再次插入,但会失败,并且不会插入和数据。然后再次尝试插入,该行的标识现在是3 任何建议都将不胜感激 谢谢。仅仅因为列具有标识规范并不一定意味着它是唯一的 如果该列上没有唯一约束或主键约束,则可以将多个相同的值插入该列的行中 但是,通常情况下,标识列将是主键或至少对其具有唯一约束,在这种情况下,尝试插入已存在的值将导致错误唯一约束冲突或类似情况 为了能够在标识
谢谢。仅仅因为列具有标识规范并不一定意味着它是唯一的 如果该列上没有唯一约束或主键约束,则可以将多个相同的值插入该列的行中 但是,通常情况下,标识列将是主键或至少对其具有唯一约束,在这种情况下,尝试插入已存在的值将导致错误唯一约束冲突或类似情况 为了能够在标识列中插入特定值,您需要启用SET IDENTITY_insert table name,否则,SQL Server甚至会阻止您为标识列指定值 如需说明,请尝试以下方法:
-- create demo table, fill with values
CREATE TABLE IdentityTest (ID INT IDENTITY, SomeValue CHAR(1))
INSERT INTO IdentityTest(SomeValue) VALUES('A'), ('B'), ('C')
SELECT * FROM IdentityTest -- Output (1)
-- insert duplicate explicit values into table
SET IDENTITY_INSERT IdentityTest ON
INSERT INTO IdentityTest(ID, SomeValue) VALUES(1, 'Z'), (2, 'Y')
SET IDENTITY_INSERT IdentityTest OFF
SELECT * FROM IdentityTest -- Output (2)
-- add unique constraint
TRUNCATE TABLE dbo.IdentityTest
ALTER TABLE IdentityTest ADD CONSTRAINT UX_ID UNIQUE(ID)
INSERT INTO IdentityTest(SomeValue) VALUES('A'), ('B'), ('C')
SET IDENTITY_INSERT IdentityTest ON
INSERT INTO IdentityTest(ID, SomeValue) VALUES(1, 'Z') -- error message (3)
DROP TABLE IdentityTest
产出1:
ID SomeValue
1 A
2 B
3 C
产出2:
ID SomeValue
1 A
2 B
3 C
1 Z
2 Y
错误消息3:
Msg 2627,第14级,状态1,第9行
违反唯一密钥约束“UX_ID”。无法在对象“dbo.IdentityTest”中插入重复键。重复的键值为1
这取决于数据插入失败的原因。例如,如果值是无效的错误类型,则标识值不会增加。但是,如果第一次插入成功,但随后由于事务失败而被删除并回滚,则标识值将递增
-- Next identity value = 1
INSERT INTO Table1 (
field1)
VALUES ('a')
-- Next identity value = 2
BEGIN TRAN
INSERT INTO Table1 (
field1)
VALUES ('b')
-- Next identity value = 3
ROLLBACK TRAN
-- Next identity value = 3, although the insertion was removed.
INSERT INTO Table1 (
field1)
VALUES ('c')
-- Next identity value = 4
第一次插入的标识列值为1,第二次插入失败,第三次插入的标识列值为3。一种方法是在行已经存在时阻止插入 如果不存在,请从SomeCol=@SomeVal的表中选择ID 在表中插入值@SomeVal