没有触发器的Oracle Auto_increment主键

时间:2013-10-09 16:05:48

标签: oracle primary-key

有很多帖子表明在Oracle中使用自动增量主键(如MySQL的auto_increment属性)的可接受方式是一个触发器。

但是,如果我不想要触发器怎么办?我已经找到了很多方法,我想知道这些方法的优点/缺点是什么。

第一个选项

我想我知道为什么不推荐这种方法。从人的角度来看这是显而易见的,但从数据库的角度来看可能是危险的。

INSERT INTO MY_TABLE (PK, NAME, PASSWORD) VALUES
(((SELECT MAX(PK) FROM MY_TABLE)+1), :bound_name, :bound_password)

第二个选项

假设MY_TABLE_PK是我们事先创建的序列:

VARIABLE id NUMBER;
BEGIN
    :id := MY_TABLE_PK.NEXTVAL;
    INSERT INTO MY_TABLE (PK, NAME, PASSWORD) VALUES
    (:id,:bound_name,:bound_value);
END;

第三个选项

再次假设MY_TABLE_PK是我们事先创建的序列:

INSERT INTO MY_TABLE (PK, NAME, PASSWORD)
SELECT MY_TABLE_PK.NEXTVAL, 'literal name', 'literal password'
FROM DUAL

在我的实验中,所有这些都在某些情况下起作用,但不是100%的时间。

2 个答案:

答案 0 :(得分:4)

我的方法总是这样:

INSERT INTO MY_TABLE (PK, NAME, PASSWORD)values (MY_TABLE_PK.NEXTVAL, 'literal name', 'literal password');

最简单的是为什么选择复杂的?

选项2根本不需要,其他选项都很好,但总是采用最简单的方法来减少错误和维护。

答案 1 :(得分:1)

通常@Lokesh的答案是最好的。如果您使用的是12c,那么请务必查看@ kordirko关于identity的评论。

另一种选择是使用SYS_GUID自动生成主键。主键将使用比数字更多的空间,但具有全局唯一的附加优势。

create table test1(id raw(16) default sys_guid(), a number);
insert into test1(a) values(1);
select * from test1;

ID                                  A
--------------------------------    -
BFFE63BD3ADE4209AC906CECE750C3AE    1