【问题标题】:ORA-01400: cannot insert NULL into ("EnvironmentName"."Project name"."ID") in ORACLE APEXORA-01400: 无法在 ORACLE APEX 中将 NULL 插入 ("EnvironmentName"."Project name"."ID")
【发布时间】:2020-01-25 00:38:31
【问题描述】:

我“从文件”(xls)创建了一个应用程序,并且项目创建成功,我可以看到行。原始表显然没有在 APEX 上创建应用程序时自动添加的“ID”。我正在尝试添加新行,但它没有给我 "ID" 的文本字段,所以当我将所有数据添加到新行时,它会抱怨此消息。如何使 ID 自动添加?或者有什么其他方法可以停止出现这个错误?

【问题讨论】:

  • 检查 id 列的表定义。是自动识别吗?您可以将 id 列更改为 identity 'columnname NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCRE

标签: oracle oracle-apex oracle-apex-5.1


【解决方案1】:

一种选择是将 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>

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 2013-02-21
    • 1970-01-01
    • 2017-09-01
    • 2018-11-08
    • 2011-08-23
    • 2016-08-21
    • 2016-06-21
    • 2012-08-09
    相关资源
    最近更新 更多