SQL增量ID分配

时间:2012-10-19 10:12:58

标签: sql oracle formatting increment

我想将新值插入Oracle表。该表非常大,ID代码存储为数字。我想编写插入语句,可以添加我的新信息并自动分配一个尚未采用的ID。

例如:

insert into example_table values
(
(select max(person_id)+1 from example_table),
99, 'example name', 'example type');

但上面的代码显然不起作用,因为我指定了一个ID(99)。如果我在上面的代码片段中将99设置为null,那么它会起作用吗?不知道如何格式化。

感谢。

2 个答案:

答案 0 :(得分:3)

这是错误的做法。它不会扩展,也不适用于多用户环境。

显然,Oracle 12c将像MSSQL一样具有AUTOINCREMENT功能。在此期间,您将需要创建一个序列并使用它。

insert into example_table 
values ( person_id_seq.nextval, 'example name', 'example type')

Find out more.

答案 1 :(得分:1)

您可以通过在数据库表上定义序列和触发器来完成此操作。 序列将按顺序依次出售id。插入行时触发器将触发,并询问序列中的下一个可用id,然后将其放入表中。这样,传递NULL将正常工作..

CREATE SEQUENCE YOUR_SCHEMA_NAME.IDSEQ
  START WITH 9988
  MAXVALUE 999999999999999999999999999
  MINVALUE 1
  NOCYCLE
  NOCACHE
  NOORDER;

CREATE OR REPLACE TRIGGER YOUR_SCHEMA_NAME.YOUR_TABLE_NAME_bir
BEFORE INSERT
ON YOUR_SCHEMA_NAME.YOUR_TABLE_NAME REFERENCING NEW AS NEW
FOR EACH ROW

BEGIN

  -- Custom code to: generate primary key from idseq if no id is passed

  IF :NEW.id IS NULL THEN
    :NEW.id := idseq.NEXTVAL;
  END IF;

EXCEPTION
  WHEN OTHERS THEN
    raise_application_error(-20570, 'System error: ' || SQLCODE || ':' || SQLERRM, TRUE);
END;
/