在 Oracle 中定义自动增量时插入触发器的行为

Posted

技术标签:

【中文标题】在 Oracle 中定义自动增量时插入触发器的行为【英文标题】:Behaviour of insertion trigger when defining autoincrement in Oracle 【发布时间】:2011-02-28 16:26:54 【问题描述】:

我一直在寻找一种在 Oracle 中定义自动增量数据类型的方法,并在 Stack Overflow 上找到了这些问题:

    Autoincrement in Oracle 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;

我对这个触发器的行为有些怀疑:

    当提供的“id”值与 NULL 不同时,此触发器会做什么? “新”前的冒号是什么意思?

我希望触发器以序列的下一个值作为 ID 插入新行,无论提供的“new.id”值是什么。我想 WHEN 语句使触发器仅在提供的 ID 为 NULL 时才插入新行(否则它不会插入或失败)。

我是否可以删除 WHEN 语句,以便触发器始终使用序列的下一个值插入?

【问题讨论】:

【参考方案1】:

WHEN 条件指定触发触发器必须为 TRUE 的条件。在此示例中,仅当新行具有 NULL IS 时才会触发触发器。当 ID 不为 null 时,触发器不会触发,因此插入语句中给出的任何值 ID 都将保持不变。

是的,如果您只是删除 WHEN 条件,那么触发器将始终触发,因此将始终为 ID 提供序列值。

【讨论】:

【参考方案2】:
    什么都没有。这允许手动指定一个值。 它是列的新值的占位符。

【讨论】:

因此,如果我手动指定一个值(NULL 除外),我可以使用已在使用的“id”值插入一个新行(仅在“id”列未使用的情况下)独特)。我错了吗?我可以删除 WHEN 语句,以便触发器始终使用序列的下一个值插入(忽略提供的“new.id”值)? @Genba:你在这两点上都是对的。事实上,允许手动输入免费 ID 可能会产生令人讨厌的副作用:序列可以在将来生成该值。【参考方案3】:

你有两种方法可以做:

如果表格如下所示:

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

你的顺序是这样的:

create sequence test_seq 
start with 1 
increment by 1 
nomaxvalue;  

您可以创建这样的触发器(没有像 Tony Andrews 所说的 When 语句)

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!'); 

【讨论】:

以上是关于在 Oracle 中定义自动增量时插入触发器的行为的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 触发器创建自动编号

Oracle 自动增量触发器问题

oracle DB 中的自动增量替代方案

Oracle 包中的自动增量

在oracle创建表的时候,如何定义字符型的列,在插入数据之后,自动将其转换成大写或小写?

Oracle之触发器