ORA-01400错误咨询:未插入NUMB列却提示无法插入NULL
解答ORA-01400: cannot insert NULL into ("GRT2158A"."BUVETTE"."NUMB")问题
嘿,这个坑我之前踩过,咱们来理清楚为啥会出现这个问题:
核心原因
你的NUMB列是带非空约束的主键,但Oracle不会自动给主键列生成值——除非你专门配置了自动填充的机制(比如自增序列、IDENTITY列)。当你执行INSERT语句时没有指定NUMB列,数据库就会默认尝试给它插入NULL,这直接违反了主键的非空约束,所以就抛出了ORA-01400错误。
看你的插入语句:
INSERT INTO Buvette(Emplacement, NumS) SELECT Emplacement, NumS FROM GILLES_HUBERT.tp4_buvettes;
确实没有包含NUMB列,数据库自然会给它塞NULL,触发报错。
解决方案
根据你的业务需求,选下面一种方式解决:
1. 从源表或其他地方获取NUMB的值
如果GILLES_HUBERT.tp4_buvettes里有对应的编号列,直接把它加到SELECT语句里,显式插入:
INSERT INTO Buvette(NUMB, Emplacement, NumS) SELECT 源表中的编号列, Emplacement, NumS FROM GILLES_HUBERT.tp4_buvettes;
2. 让数据库自动生成NUMB的值
如果NUMB是自增ID类的主键,分两种版本处理:
Oracle 12c及以上版本:可以把
NUMB改成IDENTITY列,自动生成递增值:ALTER TABLE BUVETTE MODIFY NUMB NUMBER GENERATED ALWAYS AS IDENTITY;改完之后,再执行你原来的INSERT语句就不会报错了,数据库会自动给
NUMB赋值。Oracle 12c以下版本:需要手动创建序列和触发器来实现自增:
首先创建序列:CREATE SEQUENCE seq_buvette_numb START WITH 1 INCREMENT BY 1;然后创建触发器,在插入前给
NUMB赋值:CREATE OR REPLACE TRIGGER trg_buvette_numb BEFORE INSERT ON BUVETTE FOR EACH ROW BEGIN SELECT seq_buvette_numb.NEXTVAL INTO :NEW.NUMB FROM DUAL; END; /配置完成后,执行你的INSERT语句,触发器会自动给
NUMB填充序列的下一个值。
补充提醒
主键的非空约束是强制规则,不管你插不指定这个列,数据库都要求它必须有有效值——要么你主动提供,要么让数据库通过配置自动生成,没有其他绕过的办法哦。
内容的提问来源于stack exchange,提问作者user8078246
相关产品推荐
相关产品推荐

