我有一个主键,我不想自动递增(出于各种原因),因此我正在寻找一种在插入时简单地递增该字段的方法。简单来说,我的意思是没有存储过程,也没有触发器,所以只是一系列 SQL 命令(最好是一个命令)。
到目前为止,这是我尝试过的:
BEGIN TRAN
INSERT INTO Table1(id, data_field)
VALUES ( (SELECT (MAX(id) + 1) FROM Table1), '[blob of data]');
COMMIT TRAN;
* Data abstracted to use generic names and identifiers
然而,执行时,命令出错,说
“在此不允许子查询
语境。只有标量表达式是
允许”
那么,我该怎么做/我做错了什么?
编辑:由于有人指出这是一个考虑因素,因此保证要插入的表至少已经有 1 行。
你知道你们会发生碰撞吗?
你需要做这样的事情,这可能会导致死锁,所以要非常确定你想在这里完成什么
DECLARE @id int
BEGIN TRAN
SELECT @id = MAX(id) + 1 FROM Table1 WITH (UPDLOCK, HOLDLOCK)
INSERT INTO Table1(id, data_field)
VALUES (@id ,'[blob of data]')
COMMIT TRAN
为了解释碰撞的事情,我提供了一些代码
首先创建这个表并插入一行
CREATE TABLE Table1(id int primary key not null, data_field char(100))
GO
Insert Table1 values(1,'[blob of data]')
Go
现在打开两个查询窗口并同时运行
declare @i int
set @i =1
while @i < 10000
begin
BEGIN TRAN
INSERT INTO Table1(id, data_field)
SELECT MAX(id) + 1, '[blob of data]' FROM Table1
COMMIT TRAN;
set @i =@i + 1
end
你会看到一堆这样的东西
服务器:消息 2627,级别 14,状态 1,第 7 行
违反主键约束“PK__Table1__3213E83F2962141D”。无法在对象“dbo.Table1”中插入重复的键。
该语句已终止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)