Sql ORA-01400:即使I';I’我不插入那一列

Sql ORA-01400:即使I';I’我不插入那一列,sql,oracle,Sql,Oracle,我得到这个错误:ORA-01400:无法将NULL插入(“GRT2158A”“BUVETTE”“NUMB”) 这是我的密码: INSERT INTO Buvette(Emplacement, NumS) SELECT Emplacement, NumS FROM GILLES_HUBERT.tp4_buvettes; 我所理解的:NUMB是一个主键,它带有一个检查它是否为null的约束。那么,我不能在那里插入NULL 我不明白的是:我甚至没有插入“麻木”列,只是放置和NUM。为什么它会抱怨NU

我得到这个错误:
ORA-01400:无法将NULL插入(“GRT2158A”“BUVETTE”“NUMB”)

这是我的密码:

INSERT INTO Buvette(Emplacement, NumS)
SELECT Emplacement, NumS
FROM GILLES_HUBERT.tp4_buvettes;
我所理解的:NUMB是一个主键,它带有一个检查它是否为null的约束。那么,我不能在那里插入NULL

我不明白的是:我甚至没有插入“麻木”列,只是放置和NUM。为什么它会抱怨NUMB?

但是您正在插入
NULL
——或者至少是默认值。您没有将它包含在获取值的列中,因此它需要获取一些值。显然,没有违约

在Oracle中,这通常意味着未将触发器分配给表。您需要学习如何在列中插入唯一值。这通常通过以下顺序进行处理:

INSERT INTO Buvette(NumB, Emplacement, NumS)
    SELECT buvette_sequence.nextval, Emplacement, NumS
    FROM GILLES_HUBERT.tp4_buvettes;

这假设为表定义了一个序列——我不知道实际情况是否如此。

如果没有为列提供任何值,则将使用其默认值创建该列的值,如果未指定默认值,则将插入
NULL

因此:

等同于做:

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
);
或者您可以使用
标识
列:

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;
INSERT INTO Buvette ( NumB, Eplacement, NumS )
SELECT Buvette__NumB__Seq.NEXTVAL,
       Emplacement,
       NumS
FROM   GILLES_HUBERT.tp4_buvettes;