一种选择是将 ID 列(在 Apex 中)设置为“不需要”并使用数据库触发器将其填充到数据库中。通常,它是一个序列。
首先,找到ID当前的MAX值为
SQL> select * From test;
ID ENAME
---------- ----------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
SQL> select max(id) from test;
MAX(ID)
----------
7654
序列应该从 7655 开始:
SQL> create sequence seq_test_id start with 7655;
Sequence created.
触发器:
SQL> create or replace trigger trg_bi_test
2 before insert on test
3 for each row
4 begin
5 :new.id := seq_test_id.nextval;
6 end;
7 /
Trigger created.
测试
SQL> insert into test (ename) values ('Littlefoot');
1 row created.
SQL> select * from test;
ID ENAME
---------- ----------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7655 Littlefoot
6 rows selected.
SQL>
由于它适用于 SQL*Plus,它也适用于 Apex。
另一种选择是在 Apex 中创建一个 进程,它可以:
:P1_ID := seq_test_id.nextval;
或者,如果您的数据库版本足够高(12c 及以上),您可以使用 identity 列。不幸的是,您不能将表和修改现有 ID 列更改为标识列。如果您负担得起,请创建一个新列用作 ID。
SQL> alter table test add new_id number
2 generated always as identity
3 start with 7655;
Table altered.
很遗憾,您不能将其设置为“旧”ID 值:
SQL> update test set new_id = id;
update test set new_id = id
*
ERROR at line 1:
ORA-32796: cannot update a generated always identity column
所以,如果你同意的话:
SQL> select * From test;
ID ENAME NEW_ID
---------- ------ ----------
7369 SMITH 7655
7499 ALLEN 7656
7521 WARD 7657
7566 JONES 7658
7654 MARTIN 7659
然后只需删除旧的 ID 列并将新列重命名为其“旧”名称:
SQL> alter table test drop column id;
Table altered.
SQL> alter table test rename column new_id to id;
Table altered.
SQL> select * from test;
ENAME ID
------ ----------
SMITH 7655
ALLEN 7656
WARD 7657
JONES 7658
MARTIN 7659
SQL>