在Oracle SQL中,为实体创建主键值的最佳方法是什么?我一直在为每个不同的实体添加100,并将新实体增加1,但我可以看到这是不好的,因为如果我在表中有超过100个插入,我会重用一个主键号。我有很多带主键的表,如何确定一种方法来确保所有值都是唯一的,并且它们不可能与其他主键值重叠? 我一直在做的一个例子如下:
create table example (
foo_id number(5);
Constraint example_foo_id_pk Primary key (foo_id);
Insert Into example
Values(2000);
Insert Into example
Values(2010);
create table example2 (
foobar_id number(5);
Constraint example2_foobar_id_pk Primary key (foobar_id);
Insert Into example2
Values (2100);
Insert Into example2
Values (2110);
答案 0 :(得分:2)
在Oracle中,人们通常使用sequences
来生成数字。在insert trigger
中,查询序列的下一个值并将其放入主键字段中。所以你通常不会自己传递该字段的值。
这样的事情:
CREATE SEQUENCE seq_example;
CREATE OR REPLACE TRIGGER tib_example
BEFORE INSERT ON example
FOR EACH ROW
BEGIN
SELECT seq_example .NEXTVAL
INTO :new.foo_id
FROM dual;
END;
/
然后你可以插入一条记录,而不传递id的任何值,仅用于其他字段。
如果您希望键在多个表上是唯一的,则可以对每个表使用相同的序列,但通常根本不需要。如果foo
和bar
是不同的实体,则{{1}}和{{1}}可以具有相同的数字ID。
如果您希望每个实体在整个数据库中都有唯一的ID,您可以考虑using GUIDs。
答案 1 :(得分:0)
尝试使用序列..
CREATE SEQUENCE Seq_Foo
MINVALUE 1
MAXVALUE 99999999
START WITH 1
INCREMENT BY 1;
要在插入中使用序列,请使用Seq_Foo.NextVal。
答案 2 :(得分:0)
从Oracle数据库12C开始,您可以使用标识列。使用像
这样的东西foobar_id number(5) GENERATED BY DEFAULT ON NULL AS IDENTITY
对于旧版本,序列是推荐的方法,尽管某些ORM工具提供使用存储计数器的表。通过序列插入可以使用触发器或直接将sequence.nnextval插入到表中。如果您需要为其他目的生成ID(例如插入子表),后者可能很有用。