为什么我不能插入主键定义为 NULL 的行?

Why I can not insert a row with the primary key defined as NULL?

我从 Oracle 12c 开始。

我通过 APEX sql 研讨会创建了以下 table:

CREATE TABLE  "WS_ADDRESS" 
   (    "WS_ADDRESS_ID" NUMBER GENERATED BY DEFAULT AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE, 
    "ADDRESS_TYPE" VARCHAR2(132), 
    "NAME" VARCHAR2(132), 
    "ADDRESS_LINE_1" VARCHAR2(132), 
    "ADDRESS_LINE_2" VARCHAR2(132), 
    "ADDRESS_LINE_3" VARCHAR2(132), 
    "TOWN" VARCHAR2(132), 
    "COUNTY" VARCHAR2(132), 
    "ZIP" VARCHAR2(132), 
    "COUNTRY" VARCHAR2(132), 
    "WS_CUSTOMER_ID" NUMBER, 
     CONSTRAINT "WS_ADDRESS_PK" PRIMARY KEY ("WS_ADDRESS_ID")
  USING INDEX  ENABLE
   )
/
ALTER TABLE  "WS_ADDRESS" ADD CONSTRAINT "WS_ADDRESS_CON" FOREIGN KEY ("WS_CUSTOMER_ID")
      REFERENCES  "WS_CUSTOMER" ("WS_CUSTOMER_ID") ENABLE
/

其中 WS_ADDRESS_ID 是主键(而不是 ROWID)。我读到主 ID 现在应定义为:

GENERATED BY DEFAULT ON NULL AS IDENTITY

以上定义与此一致吗?

如果我尝试插入一个元素:

insert into ws_address (ws_address_id, address_type, name) values (NULL, 'FOO', 'BAR');

我得到:

ORA-01400: cannot insert NULL into ("WKSP_USER"."WS_ADDRESS"."WS_ADDRESS_ID")
ORA-06512: at "SYS.DBMS_SQL", line 1721


1. insert into ws_address (ws_address_id, address_type, name) values (NULL, 'FOO', 'BAR');

我知道使用触发器的旧方法,但我想避免在 Oracle 12c 中是否有更简单的方法让数据库在插入 NULL 值时分配 ID。

如果按照上面引用的方式进行更改,它会正常工作 GENERATED BY DEFAULT ON NULL AS IDENTITY,不要忘记包含 ON NULL:

CREATE TABLE  "WS_ADDRESS"  
   ( 
    "WS_ADDRESS_ID" NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE,  
    "ADDRESS_TYPE" VARCHAR2(132),  
    "NAME" VARCHAR2(132),  
    "ADDRESS_LINE_1" VARCHAR2(132),  
    "ADDRESS_LINE_2" VARCHAR2(132),  
    "ADDRESS_LINE_3" VARCHAR2(132),  
    "TOWN" VARCHAR2(132),  
    "COUNTY" VARCHAR2(132),  
    "ZIP" VARCHAR2(132),  
    "COUNTRY" VARCHAR2(132),  
    "WS_CUSTOMER_ID" NUMBER,  
     CONSTRAINT "WS_ADDRESS_PK" PRIMARY KEY ("WS_ADDRESS_ID") 
  USING INDEX  ENABLE 
   );
insert into ws_address (ws_address_id, address_type, name) values (NULL, 'FOO', 'BAR')

示例:https://livesql.oracle.com/apex/livesql/s/l4ieh6rswg8ixmw0bscv3q9mv