SQL Oracle确定主键值

时间:2014-03-20 20:54:54

标签: sql oracle insert primary-key referential-integrity

在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);

3 个答案:

答案 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的任何值,仅用于其他字段。

如果您希望键在多个表上是唯一的,则可以对每个表使用相同的序列,但通常根本不需要。如果foobar是不同的实体,则{{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(例如插入子表),后者可能很有用。

相关问题