Oracle 12c插入NULL主键行报错及自增ID配置咨询
问题解答
1. 现有建表定义是否符合规范
不符合。你当前的主键列定义为GENERATED BY DEFAULT AS IDENTITY,和推荐的GENERATED BY DEFAULT ON NULL AS IDENTITY的核心差异如下:
GENERATED BY DEFAULT AS IDENTITY:仅当插入语句未显式指定该列的值时,数据库才会自动生成ID;如果显式传入NULL,数据库会尝试直接写入NULL,由于你的列附加了NOT NULL约束,就会触发ORA-01400报错。GENERATED BY DEFAULT ON NULL AS IDENTITY:无论插入时未指定该列,还是显式传入NULL,数据库都会自动生成序列值填充主键,完全符合你的需求。
2. Oracle 12c 最简解决方案
无需创建触发器,直接修改现有表的标识列属性即可,执行以下DDL:
ALTER TABLE "WS_ADDRESS" MODIFY "WS_ADDRESS_ID" GENERATED BY DEFAULT ON NULL AS IDENTITY;
修改完成后,你原来的插入语句就可以正常执行:
insert into ws_address (ws_address_id, address_type, name) values (NULL, 'FOO', 'BAR');
可选兼容方案(无需修改表结构)
如果你暂时不想调整表定义,也可以通过调整插入语句规避报错:
- 插入时不指定
WS_ADDRESS_ID列,数据库会自动生成ID:insert into ws_address (address_type, name) values ('FOO', 'BAR'); - 显式指定该列值为
DEFAULT:insert into ws_address (ws_address_id, address_type, name) values (DEFAULT, 'FOO', 'BAR');
内容的提问来源于stack exchange,提问作者M.E.
相关产品推荐
相关产品推荐

