我“从文件”(xls)创建了一个应用程序,并且该项目创建成功,可以看到这些行。原始表显然没有在APEX上创建应用程序时自动添加的“ ID”。我正在尝试添加新行,但是没有给我“ ID”的文本字段,因此当我将所有数据添加到新行中时,它会显示此消息。如何使ID自动添加?还是有其他方法可以停止收到此错误?
bluelanyuying 回答:ORA-01400:无法将NULL插入ORACLE APEX中的(“ EnvironmentName”。“ Project name”。“ ID”)
一种选择是将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和更高),则可以使用身份列。不幸的是,您不能将表更改,也不能将现有的ID列 modify 更改为identity列。如果可以承受,请创建一个新列以用作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>