SQL/Oracle-";无法将null插入主键“中”;

SQL/Oracle-";无法将null插入主键“中”;,sql,oracle,null,primary-key,oracle-apex,Sql,Oracle,Null,Primary Key,Oracle Apex,所以,我有一个Oracle数据库(在APEX中),其中有一列名为“Scheme” 如下图所示: CREATE TABLE Scheme ( Scheme_ID NUMBER NOT Null, description VARCHAR2 (800) , price FLOAT (3) , amount_sold INTEGER , Personal_Trainer_ID NUMBER NOT NULL ) ; ALTER TABLE Schema ADD CONSTRAINT S

所以,我有一个Oracle数据库(在APEX中),其中有一列名为“Scheme”

如下图所示:

CREATE TABLE Scheme
  (
Scheme_ID    NUMBER NOT Null,
description VARCHAR2 (800) ,
price FLOAT (3) ,
amount_sold     INTEGER ,
Personal_Trainer_ID NUMBER NOT NULL
) ;
ALTER TABLE Schema ADD CONSTRAINT Schema_PK PRIMARY KEY ( Schema_ID ) ;
现在,我所有的表都是这样设置的,并且工作得很好,但是当我尝试在我的Scheme上插入时,它表示我正在尝试在主键Scheme_ID中插入null

我将向您展示我使用的两个SQL插入。一个是私人教练,另一个是计划

INSERT INTO Personal_Trainer (name, loginname, date_of_birth, password)
VALUES('Bojan', 'Bojan', '15-07-1974','fitline');
Peronal_Trainer有一个私人_Trainer_ID作为主键,设置与计划完全相同。插入此命令效果非常好

insert into schema (description, price, amount_sold, Personal_Trainer_ID)
values ('3x pushups, 5x bench, 7x squats - 15kg',200, 1, 2);
现在,当我尝试插入此命令时,会收到以下错误消息:

ORA-01400:无法将NULL插入(“方案”。“方案ID”)

****************************编辑*****************************************

CREATE TABLE Personal_Trainer
(
Personal_Trainer_ID NUMBER  NOT NULL,
name                VARCHAR2 (35) ,
date_of_birth       DATE ,
loginname           VARCHAR2 (35) ,
password            VARCHAR2 (35)
) ;
ALTER TABLE Personal_Trainer ADD CONSTRAINT Personal_Trainer_PK PRIMARY KEY     ( Personal_Trainer_ID ) ;

这是我的私人教练表。

因为
Scheme\u ID
是主键且不为空

要在每次插入记录时解决此问题,您应该为
Scheme\u ID
插入值,或者将其从pk中删除并使其为空


至于私人教练,你确定私人教练id是主键吗?由于无法将null插入主键

主键没有null约束,因此必须在主键中插入一些值才能进行插入。

Oracle没有自动增量列。
相反,您需要创建序列,如
创建序列序列方案ID

然后使用
插入模式(方案ID、说明、价格、销售金额、私人培训师ID)
数值(下一步的顺序方案,'3x俯卧撑,5x长凳,7x下蹲-15kg',200,1,2)

您可以将序列逻辑放入“每行插入前”触发器
在这种情况下,您可以插入行而不提及主键列。
触发器将自动用sequence.nextval值填充它。
这是私人教练台的情况。

您可以找到此触发器并为SCHEMA表创建类似的触发器。

您需要为
schemeid
提供一个唯一的、非空的值

Oracle 12c允许您将此列优雅地定义为标识列:

CREATE TABLE Scheme
(
    Scheme_ID NUMBER GENERATED BY DEFAULT AS IDENTITY
    description VARCHAR2 (800) ,
    price FLOAT (3) ,
    amount_sold INTEGER ,
    Personal_Trainer_ID NUMBER NOT NULL
);
不幸的是,在早期的Oracle版本中,此选项不可用。惯用的解决方案是声明一个序列:

CREATE SEQUENCE scheme_id_seq;
或者直接使用它:

INSERT INTO schema 
(scheme_id, description, price, amount_sold, Personal_Trainer_ID)
VALUES 
(scheme_id_seq.nextval, '3x pushups, 5x bench, 7x squats - 15kg',200, 1, 2);
或创建触发器以自动填充:

CREATE OR REPLACE TRIGGER schema_insert_tr
BEFORE INSERT ON schema
FOR EACH ROW
BEGIN
    IF :new.scheme_id IS NULL THEN
        SELECT scheme_id_seq.nextval INTO :new.scheme_id FROM DUAL;
    END IF;
END;

哦,我发现了,NOTNULL约束仍然可以正常工作,但我的列实际上被称为“Schema”(其他语言),显然这在Oracle中有一个定义。因此,它从未被更改为主键。更改表格他的名字应该行得通

感谢您的快速响应和帮助


不要在表名中使用保留术语

'Sheme\u ID'是一个'NOT NULL'字段,但它不在您的insert语句中。这是我的私人教练表,它的编号也不为NULL,但我不必插入私人教练ID,它应该是自动递增的,但当我使用这一行时,我收到另一条错误消息。你能给我看一些个人表格的数据吗_trainer@Ivaro18尽量将代码保留在问题中,而不是作为注释。请检查表名。创建表“scheme”并更改表“schema”。桌面私人教练机上是否存在任何插入触发器?可能是在触发器中设置了field Personal_Trainer_ID。但我需要一个Scheme_ID作为主键,每次插入它都不利于最终用户,因此我认为这不是一个好主意:/