cde*_*zaq 6 sql language-agnostic sql-server sql-server-2005 insert
我有一个主键,我不想自动递增(由于各种原因),所以我正在寻找一种方法来简单地增加该字段,当我插入.简单来说,我的意思是没有存储过程和没有触发器,所以只需要一系列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
Run Code Online (Sandbox Code Playgroud)
但是,执行时,命令错误,说
"在此上下文中不允许使用子查询.只允许使用标量表达式"
那么,我该怎么做/我做错了什么?
编辑:因为它被指出是一个考虑因素,所以要插入的表保证至少有一行.
SQL*_*ace 10
你明白你会碰撞吗?
你需要做这样的事情,这可能会导致死锁,所以要非常肯定你要在这里完成什么
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
Run Code Online (Sandbox Code Playgroud)
为了解释碰撞事项,我提供了一些代码
首先创建此表并插入一行
CREATE TABLE Table1(id int primary key not null, data_field char(100))
GO
Insert Table1 values(1,'[blob of data]')
Go
Run Code Online (Sandbox Code Playgroud)
现在打开两个查询窗口并同时运行它
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
Run Code Online (Sandbox Code Playgroud)
你会看到一堆这些
服务器:消息2627,级别14,状态1,行7违反PRIMARY KEY约束'PK__Table1__3213E83F2962141D'.无法在对象'dbo.Table1'中插入重复键.该语句已终止.