SQL Server:插入下一个可用的int

Pau*_*and 6 sql sql-server insert auto-increment

我正在处理SQL Server中有一个serial_no列的表,该列被定义为非null int.它似乎不是一个自动递增字段,就好像我从插入语句中留下该列我得到一个错误,说该serial_no字段不能为空.

那么如何插入下一个可用的号码?

我试过这个:

INSERT INTO mytable (serial_no) VALUES ( (SELECT MAX(serial_no)+1 FROM mytable))
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误,说子查询不能在这种情况下使用.

编辑:此表用于现成的产品,因此我无法更改设计并使serial_no列成为自动增量.

gbn*_*gbn 9

您可以使用锁定提示来改进写入并发性

INSERT INTO mytable (serial_no, value)
SELECT MAX (serial_no)+1, @value 
FROM mytable WITH (ROWLOCK, XLOCK, HOLDLOCK)
Run Code Online (Sandbox Code Playgroud)

如果性能不重要,请尝试使用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
Run Code Online (Sandbox Code Playgroud)

或者更改为IDENTITY列并正确执行...