我想将行插入到具有唯一的非自动递增主键的表中.
是否有本机SQL函数来评估最后一个密钥并增加它,或者我必须分两步执行:
key = select max(primary.key) + 1
INSERT INTO dbo.TABLE (primary.key, field1, fiels2) VALUES (KEY, value1, value2)
Run Code Online (Sandbox Code Playgroud)
Jor*_*dão 21
由于它是自动生成的,只是不提供它:
INSERT INTO bo.TABLE (field1, fiels2) VALUES (value1, value2)
Run Code Online (Sandbox Code Playgroud)
更新:如果您的列是列,则可以使用IDENTITY.
要为标识列提供显式值,您必须执行以下操作:
set identity_insert bo.TABLE on
INSERT INTO bo.TABLE (primary_key, field1, fiels2) VALUES ((SELECT ISNULL(MAX(id) + 1, 0) FROM bo.Table), value1, value2)
set identity_insert bo.TABLE off
Run Code Online (Sandbox Code Playgroud)
但这样做没有令人信服的理由.
Seb*_*ine 13
从整个评论来看,您在表上的主键不是标识列.
如果您的SQL Server版本是SQL 2012,您应该查看序列:http://msdn.microsoft.com/en-us/library/ff878091.aspx
在其他版本中,您需要使用主键列的IDENTITY属性(http://msdn.microsoft.com/en-us/library/aa933196(v=sql.80).aspx)重新创建表或使用两步法.
如果采用两步法,则需要确保同时运行的插入不会最终使用相同的新值.最简单的方法是将select和insert组合成一个值并使用serializable表提示:
CREATE TABLE dbo.Tbl1(id INT PRIMARY KEY, val1 INT, val2 INT)
INSERT INTO dbo.Tbl1(id, val1, val2)
VALUES((SELECT ISNULL(MAX(id)+1,0) FROM dbo.Tbl1 WITH(SERIALIZABLE, UPDLOCK)), 42, 47);
SELECT * FROM dbo.Tbl1;
Run Code Online (Sandbox Code Playgroud)