2010-06-07 32 views
1

定義自動增量時,我一直在尋找一種方式來定義的Oracle自動增量數據類型和已經發現的堆棧溢出這些問題:行爲插入觸發了Oracle

  1. Autoincrement in Oracle
  2. Autoincrement Primary key in Oracle database

使用自動增量類型的方法包括定義一個序列和觸發器以使插入透明,其中插入觸發器如下所示:

create trigger mytable_trg 
before insert on mytable 
for each row 
when (new.id is null) 
begin 
    select myseq.nextval into :new.id from dual; 
end; 

我對這個觸發器的行爲有些疑惑:

  1. 這是什麼觸發時做「ID」的提供的值是NULL有什麼不同?
  2. 「新」之前的冒號是什麼意思?

我想觸發器插入新的行,序列的下一個值作爲ID,無論提供的「new.id」是什麼值。我想如果提供的ID是NULL,那麼WHEN語句使觸發器只插入新行(否則它不會插入或失敗)。

我可以只刪除WHEN語句以使觸發器始終使用序列的下一個值插入嗎?

回答

1
  1. 什麼都沒有。這允許手動指定一個值。
  2. 它是該列新值的佔位符。
+0

所以,如果我手動指定的值(NULL以外),我可以插入使用「的ID值的新行「已在使用中(僅在」id「列不是唯一的情況下)。我錯了嗎? 我可以只刪除WHEN語句,以便觸發器始終使用序列的下一個值插入(忽略提供的「new.id」值)? – Genba 2010-06-07 12:34:58

+0

@Genba:你說的都對。事實上,允許手動輸入免費ID可能會產生令人厭惡的副作用:該序列將來可能會生成該值。 – 2010-06-07 14:08:39

2

WHEN條件指定觸發器觸發時必須爲TRUE的條件。在這個例子中,觸發器只會在新行有一個NULL IS時觸發。當ID不爲空時,觸發器將不會觸發,因此插入語句中給出的任何值ID都將被單獨保留。

是的,如果您只是刪除WHEN條件,那麼觸發器將始終啓動,因此將始終提供ID的序列值。

1

你有2種方法,你可以這樣做:

如果表是這樣的:

create table my_test (
id number, 
my_test data varchar2(255) 
); 

和你的順序是這樣的:

create sequence test_seq 
start with 1 
increment by 1 
nomaxvalue; 

您可以創建這樣一個觸發(沒有時像託尼安德魯斯說)

create trigger test_trigger 
before insert on my_test 
for each row 
begin 
select test_seq.nextval into :new.id from dual; 
end; 

或者你可以只是簡單用這個,那麼你並不需要一個觸發:

insert into my_test values(test_seq.nextval, 'voila!');