[英]SQL Server: insert next available int
我正在处理SQL Server中有一个serial_no
列的表,该列被定义为非null int。 它似乎不是一个自动递增字段,就像我从插入语句中删除该列一样,我得到一个错误,说明serial_no
字段不能为空。
那么如何插入下一个可用的号码?
我试过这个:
INSERT INTO mytable (serial_no) VALUES ( (SELECT MAX(serial_no)+1 FROM mytable))
但我得到一个错误,说子查询不能在这种情况下使用。
编辑:此表用于现成的产品,因此我无法更改设计并使serial_no列成为自动增量。
您可以使用锁定提示来改进写入并发性
INSERT INTO mytable (serial_no, value)
SELECT MAX (serial_no)+1, @value
FROM mytable WITH (ROWLOCK, XLOCK, HOLDLOCK)
如果性能不重要,请尝试使用TABLOCKX代替ROWLOCK,XLOCK
但是,如果这不安全,您需要重试
DECLARE @retry bit
SET @retry = 1
WHILE @Retry = 1
BEGIN
BEGIN TRY
INSERT INTO mytable (serial_no, value)
SELECT MAX (serial_no)+1, @value
FROM mytable WITH (ROWLOCK, XLOCK, HOLDLOCK)
SET @Retry = 0
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627 --PK violation
RAISERROR ('blah', 16, 1)
END CATCH
END
或者更改为IDENTITY列并正确执行...
可以通过删除VALUES来修复错误
INSERT INTO mytable (serial_no, value)
SELECT MAX(serial_no)+1 ,
@value
FROM mytable)
但这是个坏主意。 MAX(serial_no)+1上存在竞争条件(例如,两个插入获得Max(Serial_no)的相同值。
你最好使用自动增量字段。 您还可以创建一个存储当前下一个值的表,并将其递增而不是使用max。
INSERT INTO mytable (serial_no) SELECT MAX(serial_no)+1 FROM mytable
尝试没有VALUES:
INSERT INTO mytable (serial_no) SELECT MAX(serial_no)+1 FROM mytable
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.