0

我想向 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,它会起作用吗?不知道怎么格式化。

谢谢。

4

2 回答 2

3

这是错误的做法。它不能扩展,也不能在多用户环境中工作。

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

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

了解更多。

于 2012-10-19T10:20:13.580 回答
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;
/
于 2012-10-19T10:16:51.627 回答