我"从文件"(xls(创建了一个应用程序,项目创建成功,我可以看到行。原始表显然没有在 APEX 上创建应用程序时自动添加的"ID"。我正在尝试添加一个新行,但它没有给我"ID"的文本字段,所以当我把所有数据都放在一个新行时,它会抱怨这条消息。如何使 ID 自动添加?或者任何其他方法可以停止收到此错误?
一种选择是将 ID 列(在 Apex 中(设置为"不需要",并使用数据库触发器将其填充到数据库中。通常,它是一个执行此操作的序列。
首先,查找 ID 的当前最大值为
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 及更高版本(,则可以使用标识列。遗憾的是,您无法更改表并将现有 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>