SQL / Oracle - "无法在主键中插入null"

时间:2015-09-17 07:07:18

标签: 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 Schema_PK PRIMARY KEY ( Schema_ID ) ;

现在,我的所有表都是这样设置的并且完美地工作,但是当我在我的Scheme上尝试插入时,它说我试图将null插入主键scheme_ID。

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

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")

**************************** EDIT ****************** ***********************

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 ) ;

这是我的私人教练表。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

哦,我发现它,NOT NULL约束仍然正常,但我的列实际上被称为' Schema' (其他语言),显然这在Oracle中有一个定义。所以它永远不会被改变为主键。改变他的名字应该有效。

感谢您的快速响应和帮助!

不要为您的桌面名称使用保留的条款!

答案 2 :(得分:0)

因为Scheme_ID是主键而不是null,

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

至于personal_trainer,你确定personal_trainer_id是主键吗?因为无法将null插入主键

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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);

您可以在插入每行之前将序列逻辑放入""触发。
在这种情况下,您可以在不提及主键列的情况下插入行 它将通过触发器自动填充sequence.nextval值 这是Personal_Trainer表的情况 您可以找到此触发器并为SCHEMA表创建类似的触发器。