简体   繁体   中英

Is there any simple way to set max id of ID column using trigger before insert in MS SQL Server

I've almost seen every post concerning this question but haven't captured the best one. Some of them recommend using Identity but some triggers to perform incrementing integer column. I'd like also to use triggers as there will be more delete happen in my table in this case. In addition, as I have mainly come from Interbase DBMS where I used to create a before insert trigger on table this issue sucks until now as I migrated from Interbase to MS SQL Server.

This is how I did in 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

So, as I should frequently use this, which is the best way to create a trigger that increments integer column using max(id)+1 ?

Always use Identity option , because as you told that you frequently delete the record, in this case trigger will some time give wrong information ( Called Isolation level).

Suppose one transaction delete the highest one record and just before or same time your trigger fired. So it get the deleted highest record which is not exist after few second.

So when you fired select query, it show the gap which is wrong.

Sqlserver give the inbuilt mechanism of this type of situation with auto identity true option.

http://mrbool.com/understanding-auto-increment-in-sql-server/29171

You donot bother about this. Also draw back of trigger is if multiple insert happened, then it always fired after the last insert statement.

Try to never use trigger , as it is harmful and not controllable.

Still if you want , then add in your insert statement , not use trigger

How can I auto-increment a column without using IDENTITY?

Don't use triggers to do this, it will either kill the performance or cause all sorts of concurrency problems, depending on your use of transactions and locking.

It's better to use one of mechanisms available in the engine -- identity property or sequence object.

If you're running a newer version of SQL Server, with sequence feature available, use sequence. It will allow you to reserve a range of ids from the client applcation, and assign them to new rows on the client, before sending them to server for insert.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM