只将行插入到只有一个IDENTITY列的表中

我有一个只有一列的pipe理员表adminId,它是主键。 由于业务规则,它必须是这样的。

我想一劳永逸地了解如何编写存储过程,像这样在表中插入值。 我正在使用SQL Server和T-SQL并尝试使用SCOPE_IDENTITY(),但由于该表的INSERT_IDENTITY为false或closures,所以不起作用。

我真的不想插入一个虚拟值只是为了能够插入一个新的行。 谢谢!

如果你有一列是一个身份,只要做到这一点

INSERT MyTable DEFAULT VALUES; --allows no column list. The default will be the IDENTITY SELECT SCOPE_IDENTITY(); 

如果你没有身份,那么你可以设置它吗? 这是最好的方法..并使用上面的SQL。

如果没有,你想插入一个新的行

 INSERT MyTable (admidid) OUTPUT INSERTED.admidid --returns result to caller SELECT ISNULL(MAX(admidid), 0) + 1 FROM MyTable 

笔记:

  • 在高负载下MAX解决scheme可能会失败,重复
  • SCOPE_IDENTITY是事实之后,而不是之前
  • SCOPE_IDENTITY只能使用IDENTITY列。 同样使用IDENT_CURRENT也是愚蠢的
  • 输出子句replaceMAX解决scheme的SCOPE_IDENTITY

您需要将IDENTITY_INSERT添加到您的select语句中:

 SET IDENTITY_INSERT MyTable ON INSERT INTO MyTable (AdminCol) SELECT AdminColValue FROM Tableb 

当你完成后,确保你记得

 SET IDENTITY_INSERT MyTable OFF 

这里有一个很好的描述如何从BOL工作: http : //msdn.microsoft.com/en-us/library/aa259221( SQL.80) .aspx

@Phil:你是不是说你的表有两列,自动增长的PK列和AdminName列? 如果AdminName只有一列,则AdminName是PK,当然,你不能自动增加一个string。 业务规则是否期望您将完全合格的Windows用户名作为主键? 这将是可行的,是有道理的,因为那么你不需要在AdminName列的备用唯一索引。

但是,如果你的表有两列,而不是一列:

在SQLServer中,自动增量是表/列定义的一部分。 你将列定义为一个整数,然后使其成为一个标识列,指定增量,通常为1,但它可能是2或5或10或其他。 要插入一行,只需插入其他列的值,不要对PK列进行任何操作:

 insert into T (foo) -- column(s) list values('bar') -- values list 

执行插入操作的存储过程可以将SCOPE_IDENTITY作为RETURN值或SCOPE_IDENTITY作为OUT参数传回客户端。

PS SCOPE_IDENTITY()返回当前作用域中最近生成的自动增量标识值; 它不会生成下一个标识值。

编辑:

据推测,您的pipe理员表包含一组pipe理员。 但是,如果除了整数主键列以外没有其他列,则无法识别pipe理员; 你唯一能做的就是把它们区分开来。 这并没有让你感到非常满意。 但是,如果您的pipe理员表具有以下任一结构:

 ID INTEGER PRIMARY KEY AUTOINCREMENT windowsusername varchar(50) (unique index) 

要么

 windowsusername varchar(50) primary key 

你将能够从其他表中引用pipe理员的表,并且外键将是有意义的。 而这恰恰是由一个整数列组成的表所缺less的 – 意义。

有两列,你可以有一个存储过程做到这一点:

 insert into Administrators (windowsusername) values('mydomain\someusername'); return SCOPE_IDENTITY(); 

你的客户端程序会返回一个自动生成的id,并将其分配给新插入的行。 这种做法是通常的做法,我甚至会说它被认为是“最佳做法”。

PS你提到你不知道如何“插入一个值”,如果你“没有任何插入”。 那里有矛盾。 如果你没有插入的东西,为什么插入? 如果你对客户一无所知,你为什么要创造一个新的客户logging呢? 不是他们的名字,他们的城市,他们的电话号码,没有?

每当我们设置列的标识属性为“开”时,我们不需要显式地将值插入到列中。 SQL Server根据增量值隐式将值插入标识列。 这里我们将看到我们如何显式地将值插入到标识列中。 首先我们将创build一个带有标识列的表格。

以下是创build具有标识列的表的脚本: –

 create table Identitytable(id int identity,Name varchar(50)) 

在“Identitytable”表中,我将“Id”列定义为标识列。 让我们插入几行到这个表中,而不需要显式地将值插入到“Id”列中。

 insert into Identitytable(Name) values('Neeraj') insert into Identitytable(Name) values('Raj') insert into Identitytable(Name) values('Akshay') insert into Identitytable(Name) values('Ankit') insert into Identitytable(Name) values('Vikas') 

我们将在脚本上面运行,将5行插入到表“Identitytable”中,让我们来检查插入到表中的内容。

在上面的图片中,我们可以看到id列(1,2,3,4,5)的值,而我们并没有明确地将值插入到“Id”列中。 现在让我们尝试显式地将值插入“Id”列。

在下面的脚本中,我们试图显式地将值“9”插入“Id”列,让我们看看下面的插入查询的结果是什么。

 insert into Identitytable(Id,Name) values(9,'Mamta')