CREATE or replace TRIGGER "my_trigger" BEFORE
INSERT ON my_table FOR EACH ROW WHEN (new.id is null)
begin
select my_sequence.nextval into: new.id from dual;
end;
插入数据
INSERT INTO my_table(Name,phone,address) Values('Cao','56498543','Heibei');我想在ORACLE里面建立一个主键自增加的机制
上面的这触发器我不知道new.id是什么意思,我的表的主键叫pid,我应该怎么修改begin和end中间的语呢?
而且我也不明白into:和from dual的作用是什么,给我解释解释好吗?

解决方案 »

  1.   

    把语句
    select my_sequence.nextval into: new.id from dual; 
    换成
    select my_sequence.nextval into :new.id from dual; 
    就可以了。
      

  2.   

    简单解释一下:
    new.id 是语句插入时id的值,如果没有明确写除就是NULL或缺省值。 new.id前面加冒号是指bind variable的意思。
    select my_sequence.nextval into :new.id from dual; 是用my_sequence.nextval 给 new.id赋值。
    dual是个虚拟的表,只有一行一列。通常是来源没有明确的表的时候用它来作源表。如取系统时间就是:select sysdate from dual;
      

  3.   

    应该不是new.id吧,你的逐渐是pid,应该是new.pid。你的触发器是在insert前,所以它的意思应该是在你新插入记录前,取得你要插入的新记录的主键(应该是pid)。其他的字段也可以用相同的方法取到,如要取新插入记录的name字段,则使用:new.Name就可以了。
      

  4.   

    如果你用sequence作为主键自增机制的话,那么对于例子的触发器你只需要改两个地方(红色粗体标注):
    CREATE or replace TRIGGER "my_trigger" BEFORE 
    INSERT ON my_table /*改为你的表名*/
    FOR EACH ROW WHEN (new.id /*id改为你的主键pid*/is null) 
    begin 
    select my_sequence.nextval/*my_sequence改为你的序列的名字*/
     into: new.id/*id改为你的主键pid*/ from dual; 
    end; 另into:不是一个整体,而是into  :new.id。:new.id代表触发器后调用的记录行,:old代表触发器调用前的记录
    触发器很简单,你需要看看它的基础知识