1

有很多帖子表明在 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% 的时间。

4

2 回答 2

4

我的方法总是这样:

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

它最简单,为什么要选择复杂的?

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

于 2013-10-09T16:10:58.930 回答
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
于 2013-10-09T18:09:16.677 回答