2011-05-13 88 views
0

我想寫一個表「TRANSACTION」的觸發器。當插入一個新行時,我想觸發將字段「TRANSACTIONID」更新爲所有以前記錄的最大值+1。需要編寫一個觸發器

我不太瞭解SQL。有人能幫我嗎?

千恩萬謝

+0

您是否考慮過此任務的IDENTITY列?這通常被認爲是更好的方法來完成這項任務。請參閱http://msdn.microsoft.com/en-us/library/ms186775.aspx。 – 2011-05-13 10:36:14

+0

感謝您的回覆。我不想要一個自動增量列。只需要這個觸發器。你能幫我嗎? – Kevin 2011-05-13 10:38:46

+0

您使用的是什麼版本的SQL? MS SQL Server,Oracle,MySQL等? – 2011-05-13 10:40:00

回答

6

這是一個多用戶環境中一個非常糟糕的主意,因爲這將連載插入到表中。通常的做法是使用Oracle序列:

create sequence transaction_seq; 

create trigger transaction_bir before insert on transaction 
for each row 
begin 
    :new.id := transaction_seq.nextval; 
end; 

爲了編寫基於觸發器的解決方案,實際上得到的最大電流值加1,你需要寫一個複雜的3觸發的解決方案,以避免「變異表「 問題。或者你可以使用另一個表來保存這樣的電流最大值創建一個簡單的解決方案:

create table transaction_max (current_max_id number); 

insert into transaction_max values (0); 

create trigger transaction_bir before insert on transaction 
for each row 
declare 
    l_current_max_id number; 
begin 
    update transaction_max set current_max_id = current_max_id + 1 
     returning current_max_id into l_current_max_id; 
    :new.id := l_current_max_id; 
end; 

這將避免變異表的問題,將序列(減速)的插入,所以我看不到任何優勢這個過程使用一個序列。

+0

謝謝。這對我有用:) – Kevin 2011-05-13 15:28:26

0
CREATE TRIGGER trigger1 on TransactionTable 
INSTEAD OF INSERT 
AS 
BEGIN 

    DECLARE @MaxTranId INT 

    SELECT 
     @MaxTranId = MAX(TransactionId) 
    FROM 
     TransactionTable 

    INSERT INTO TransactionTable 
     SELECT 
      @MaxTranId + 1 , 
      RestOfYourInsertedColumnsHere , 
     FROM 
     inserted 
END 
GO 
+1

對於某些DBMS,這個答案可能是正確的,但對於Oracle不適用。 – 2011-05-13 12:05:54

+0

這不是併發安全的。 – 2011-05-13 12:23:39