我几乎看到每个关于这个问题的帖子,但没有抓住最好的一个。其中一些建议使用Identity
但使用triggers
来执行递增整数列。
我也想使用触发器,因为在这种情况下我的表中会发生更多的删除。另外,因为我主要来自Interbase DBMS,我曾经在桌面上创建一个before insert触发器,所以当我从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
所以,因为我经常使用这个,这是创建一个使用max(id)+1增加整数列的触发器的最佳方法吗?
答案 0 :(得分:1)
始终使用“身份”选项,因为您告诉您经常删除记录,在这种情况下,触发器会在一段时间内提供错误信息(称为“隔离级别”)。
假设一个事务删除了最高的一条记录,并且在触发器触发之前或同一时间。因此它获得了删除的最高记录,这是几秒钟后不存在的。
因此,当您触发选择查询时,它会显示错误的差距。
Sqlserver使用auto identity true选项给出了这种情况的内置机制。
http://mrbool.com/understanding-auto-increment-in-sql-server/29171
你不打扰这个。如果发生多次插入,则还会触发触发器,然后在最后一次插入语句之后总是触发。尽量不要使用触发器,因为它有害且无法控制。
如果您愿意,请添加插入语句,而不是使用触发器
答案 1 :(得分:1)
不要使用触发器来执行此操作,它会破坏性能或导致各种并发问题,具体取决于您对事务和锁定的使用。
最好使用引擎中可用的机制之一 - 标识属性或序列对象。
如果您正在运行较新版本的SQL Server,并且序列功能可用,请使用序列。它允许您从客户端应用程序中保留一系列ID,并在将它们发送到服务器以进行插入之前将它们分配给客户端上的新行。