繁体   English   中英

ORA-01400:即使我没有插入该列,也无法插入NULL

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM