SQL/Oracle - "Cannot insert null into primary key"

SQL/Oracle - "Cannot insert null into primary key"

所以,我有一个 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 ) ;

现在,我所有的 table 都像这样设置并且工作正常,但是当我尝试在我的 Scheme 上插入时,它说我正在尝试将 null 插入主键 scheme_ID.

我将向您展示我使用的 2 个 SQL 插件。一份用于 personal_trainer,一份用于计划。

INSERT INTO Personal_Trainer (name, loginname, date_of_birth, password)
VALUES('Bojan', 'Bojan', '15-07-1974','fitline');

Peronal_Trainer 有一个 Personal_Trainer_ID 作为主键,与 Scheme 完全一样。插入此命令效果很好。

insert into schema (description, price, amount_sold, Personal_Trainer_ID)
values ('3x pushups, 5x bench, 7x squats - 15kg',200, 1, 2);

现在,当我尝试插入此命令时,我收到此错误消息:

ORA-01400: 无法将 NULL 插入 ("SCHEME"."SCHEME_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 ) ;

这是我的table私人教练。

因为Scheme_ID是主键而不是空值,

要在每次插入记录时解决它,您应该为 Scheme_ID 插入值或将其从 pk 中删除并使其为空

至于personal_trainer,你确定personal_trainer_id是主键吗?因为不可能将 null 插入主键

主键没有空约束,因此您必须在主键中插入一些值才能使插入生效。

Oracle 没有 auto_increment 列。
相反,您需要创建像
这样的序列 CREATE SEQUENCE SEQ_SCHEME_ID
然后使用
insert into schema (Scheme_ID,description, price, amount_sold, Personal_Trainer_ID) values (SEQ_SCHEME_ID.nextval,'3x pushups, 5x bench, 7x squats - 15kg',200, 1, 2);

您可以将顺序逻辑放在"before insert for each row" 触发器中。
在这种情况下,您可以在不提及主键列的情况下插入行。
它将由触发器自动填充 sequence.nextval 值。
Personal_Trainer table.
就是这种情况 您可能会找到此触发器并为 SCHEMA table.

创建类似的触发器

您需要为 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;

哦,我找到了,NOT NULL 约束仍然可以正常工作,但我的专栏实际上称为 'Schema'(其他语言),显然这在 Oracle 中有定义。所以它永远不会改变为主键。更改 table 他的名字应该有效。

感谢您的快速回复和帮助!

不要为您的 TABLE 名称使用保留字词!