在MS SQL Server中插入之前,是否有任何简单的方法可以使用触发器设置id列的最大id

在MS SQL Server中插入之前,是否有任何简单的方法可以使用触发器设置id列的最大id,sql,sql-server,tsql,Sql,Sql Server,Tsql,关于这个问题,我几乎看过每一篇文章,但没有抓住最好的一篇。有些建议使用Identity,但有些建议使用触发器来执行递增整数列。 我还想使用触发器,因为在这种情况下,我的表中会发生更多的删除操作。此外,由于我主要来自Interbase DBMS,在那个里我曾经在表上创建一个插入前触发器,所以直到现在,当我从Interbase迁移到MS SQL Server时,这个问题仍然很糟糕 这就是我在Interbase中所做的 CREATE trigger currency_bi for currency a

关于这个问题,我几乎看过每一篇文章,但没有抓住最好的一篇。有些建议使用Identity,但有些建议使用触发器来执行递增整数列。 我还想使用触发器,因为在这种情况下,我的表中会发生更多的删除操作。此外,由于我主要来自Interbase DBMS,在那个里我曾经在表上创建一个插入前触发器,所以直到现在,当我从Interbase迁移到MS SQL Server时,这个问题仍然很糟糕

这就是我在Interbase中所做的

CREATE trigger currency_bi for currency
active before insert position 0
AS
declare variable m integer;
begin
    select max(id)+1 from currency into :m;
    if (:m is NULL ) then m=1;
    new.id=:m; 
end

因此,正如我应该经常使用的那样,这是创建使用maxid+1递增整数列的触发器的最佳方法?

始终使用标识选项,因为正如您所说的,您经常删除记录,在这种情况下,触发器有时会给出称为隔离级别的错误信息

假设一个事务删除了最高的一条记录,就在触发触发器之前或同时。因此,它会在几秒钟后得到不存在的已删除的最高记录

因此,当您启动select查询时,它会显示错误的间隙

Sqlserver使用auto-identity-true选项提供这种情况的内置机制

你不必为此烦恼。另外,触发器的回退是如果发生了多个insert,那么它总是在最后一个insert语句之后触发

尽量不要使用触发器,因为它有害且不可控

如果需要,仍然可以添加insert语句,而不是使用触发器


不要使用触发器来执行此操作,否则会导致性能降低或导致各种并发问题,具体取决于您对事务和锁定的使用

最好使用engine中可用的机制之一-identity属性或sequence对象


如果正在运行SQL Server的较新版本,并且序列功能可用,请使用序列。它将允许您从客户端应用程序中保留一系列id,并在将它们发送到服务器进行插入之前将它们分配到客户端上的新行。

既然您说将有许多删除,可能不仅仅是那些id最高的记录,那么在删除后您的id中仍然会有空白?这意味着为什么不只是使用标识?在负载下,除了使用标识之外的任何东西都是不安全的,例如,在一个繁忙的系统上,有多个并发用户,它将创建副本。SELECT MAXid+1是一种经典方法,一旦系统负载增加,这种方法注定会失败。只是不要这样做-使用INT标识,让数据库处理工作!我不使用的想法是由人们的意见形成的,人们更喜欢使用触发器而不是身份。好吧,那我就用身份证。因为我是SQL Server的新手。目前,我正在使用dataset xsd在c中创建数据感知应用程序,为了插入,我必须在每次插入新行时发布另一个查询,将Identity_insert设置为On。感谢marc_的回答。这是我想听但没有提到的。由于我的应用程序是多用户应用程序,将由多个会计师同时用于添加发票,因此我非常关心安全性和准确性。谢谢dean。我使用的是SQL Server 2012,最好指定列的标识,以便使用SQL Server的内置功能。2012年,我将使用sequence object。更多的控制,更多的灵活性。就性能而言,相同的身份现在在后台使用序列。