为什么我不能插入主键定义为 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
我从 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