简而言之,你不能这么做。首先,我认为你的模型在逻辑上有缺陷。您是否打算定义所有实际的数据库用户(例如,为登录创建用户…)作为[用户]中的行?你需要考虑一下,但典型的答案是否定的。如果答案是肯定的,那么你根本不需要creator列,因为它是多余的。您所需要的只是创建日期——您可能应该为其定义一个默认值。
但是,如果您想这样做,需要分两个步骤来完成(并且需要使列可以为null)。插入一行(或多行),其中包含“实”数据列的值。然后用为id生成的标识值更新这些相同的行
use tempdb;
set nocount on;
CREATE TABLE dbo.[user] (
[user_id] smallint identity(3,10) not null primary key,
[name] nvarchar(20) not null,
[active] bit not null default (1),
[created] Datetime not null default (current_timestamp),
[creator] smallint null
);
ALTER TABLE dbo.[user] ADD CONSTRAINT [fk_user] FOREIGN KEY(creator) REFERENCES dbo.[user](user_id);
GO
-- add first row
insert dbo.[user] (name) values ('test');
update dbo.[user] set creator = SCOPE_IDENTITY() where user_id = SCOPE_IDENTITY()
-- add two more rows
declare @ids table (user_id smallint not null);
insert dbo.[user] (name) output inserted.user_id into @ids
values ('nerk'), ('pom');
update t1 set creator = t1.user_id
from @ids as newrows inner join dbo.[user] as t1 on newrows.user_id = t1.user_id;
select * from dbo.[user] order by user_id;
-- mess things up a bit
delete dbo.[user] where name = 'pom';
-- create an error, consume an identity value
insert dbo.[user](name) values (null);
-- add 2 morerows
delete @ids;
insert dbo.[user] (name) output inserted.user_id into @ids
values ('nerk'), ('pom');
update t1 set creator = t1.user_id
from @ids as newrows inner join dbo.[user] as t1 on newrows.user_id = t1.user_id;
select * from dbo.[user] order by user_id;
drop table dbo.[user];
我修改了身份规范,以展示一些很少有开发人员意识到的东西。它并不总是被定义为(1,1),下一个插入的值可能由于许多原因而跳转,例如错误和缓存/重启。最后,我认为您会后悔用保留字命名表,因为对它的引用将需要使用分隔符。减轻疼痛。