Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server标识列插入失败_Sql Server - Fatal编程技术网

Sql server SQL Server标识列插入失败

Sql server SQL Server标识列插入失败,sql-server,Sql Server,嗨,伙计们,我有一个简单的问题: 当insert语句在标识列上失败时会发生什么情况 例如,如果我插入一个带有标识列的行,该标识列将为1,然后再次插入,但会失败,并且不会插入和数据。然后再次尝试插入,该行的标识现在是3 任何建议都将不胜感激 谢谢。仅仅因为列具有标识规范并不一定意味着它是唯一的 如果该列上没有唯一约束或主键约束,则可以将多个相同的值插入该列的行中 但是,通常情况下,标识列将是主键或至少对其具有唯一约束,在这种情况下,尝试插入已存在的值将导致错误唯一约束冲突或类似情况 为了能够在标识

嗨,伙计们,我有一个简单的问题:

当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