[英]ORA-01400: cannot insert NULL into even if I'm not inserting that column
我收到此错误: ORA-01400: cannot insert NULL into ("GRT2158A"."BUVETTE"."NUMB")
。
这是我的代码:
INSERT INTO Buvette(Emplacement, NumS)
SELECT Emplacement, NumS
FROM GILLES_HUBERT.tp4_buvettes;
我的理解: NUMB是一个主键,有一个约束来检查它是否为空。 然后,我不能在那里插入NULL。
我不明白:我还没有插入NUMB列,只是安置和订购数量 。 为什么抱怨NUMB?
如果您没有为列提供任何值,则将使用其默认值创建该列的值,如果尚未指定默认值,则将插入NULL
。
所以:
CREATE TABLE Buvette(
NumB NUMBER CONSTRAINT Buvette__Numb__PK PRIMARY KEY,
Emplacement NUMBER,
NumS NUMBER DEFAULT 4
);
INSERT INTO (Emplacement) VALUES ( 1 );
相当于做:
INSERT INTO (NumB, Emplacement, NumS) VALUES ( NULL, 1, 4 );
NumB
没有默认值,因此插入了NULL
,但NumS
的默认值为4,因此插入了4。
在Oracle 12c中 ,您现在可以将序列指定为默认值:
CREATE SEQUENCE Buvette__NumB__Seq;
CREATE TABLE Buvette(
NumB NUMBER DEFAULT Buvette__NumB__Seq.NEXTVAL
CONSTRAINT Buvette__Numb__PK PRIMARY KEY,
Emplacement NUMBER,
NumS NUMBER DEFAULT 4
);
或者您可以使用IDENTITY
列:
CREATE TABLE Buvette(
NumB NUMBER GENERATED ALWAYS AS IDENTITY ( START WITH 1 INCREMENT BY 1 )
CONSTRAINT Buvette__Numb__PK PRIMARY KEY,
Emplacement NUMBER,
NumS NUMBER DEFAULT 4
);
然后你可以使用你的语句,并生成NumB
的默认值:
INSERT INTO Buvette(Emplacement, NumS)
SELECT Emplacement, NumS
FROM GILLES_HUBERT.tp4_buvettes;
在早期版本中 ,您将需要使用INSERT
语句中的序列来生成递增主键:
INSERT INTO Buvette ( NumB, Eplacement, NumS )
SELECT Buvette__NumB__Seq.NEXTVAL,
Emplacement,
NumS
FROM GILLES_HUBERT.tp4_buvettes;
但是您要插入NULL
- 或者至少是默认值。 您不会在获取值的列中包含它,因此需要获取一些值。 显然,没有默认值。
在Oracle中,这通常意味着没有为表分配触发器。 您需要了解如何在列中插入唯一值。 这通常通过以下顺序处理:
INSERT INTO Buvette(NumB, Emplacement, NumS)
SELECT buvette_sequence.nextval, Emplacement, NumS
FROM GILLES_HUBERT.tp4_buvettes;
这假设为表定义了一个序列 - 我不知道实际情况是否如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.