我想将新值插入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,那么它会起作用吗?不知道如何格式化。
感谢。
答案 0 :(得分:3)
这是错误的做法。它不会扩展,也不适用于多用户环境。
显然,Oracle 12c将像MSSQL一样具有AUTOINCREMENT功能。在此期间,您将需要创建一个序列并使用它。
insert into example_table
values ( person_id_seq.nextval, 'example name', 'example type')
答案 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;
/