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