当前位置: 首页 > 知识库问答 >
问题:

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

叶恩
2023-03-14

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

现在,我所有的表都是这样设置的,并且工作得很好,但是当我尝试在我的方案上插入时,它表示我正在尝试在主键方案ID中插入null。

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

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

Peronal_Trainer有一个Personal_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插入("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 ) ;

这是我的私人教练表。

共有3个答案

魏成济
2023-03-14

因为Scheme_ID是主键且不为空,

要解决这个问题,每次你插入一条记录时,你应该为Scheme\u ID插入值,或者从pk中删除它并使其为空

至于私人教练,你确定私人教练id是主键吗?因为它不可能在主键中插入null

司徒修能
2023-03-14

哦,我找到了,非空约束仍然可以正常工作,但是我的列实际上被称为“模式”(其他语言),显然这在甲骨文中有一个定义。所以它作为主键永远不会改变。更改表他的名字应该可以工作。

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

不要对你的桌子名称使用保留术语!

澹台胜
2023-03-14

您需要为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;
 类似资料:
  • 我有一个使用存储过程填充的表。这个存储过程使用从另一个数据库调用属性的视图。 举例来说,它类似于: 视图的定义如下: 并正确插入值,但如果以这种方式使用视图: 显示此消息: 正在检查身份信息:当前身份值“1252” DBCC执行已完成。如果DBCC打印了错误消息,请与系统管理员联系。 Msg 515,第16级,状态2,过程TSP,第16行 无法将值NULL插入表db2的“金额”列中。dbo。表';

  • 我正在尝试使用单个表将数据插入到不同的表中,并且我正在插入的表具有主键。

  • 问题内容: 我试图将查询的null插入允许null的datetime列中。我的查询工作正常(我认为)。但是将其1900-01-01 00:00:00.000而不是null放入datetime列。为什么会发生这种情况,我该如何解决? 我创建了自己的表来对此进行测试,并且在那里没有空值是一个问题。但是,这是另一个数据库中的问题。我认为这一定与其他数据库有关。 问题答案: 要查看数据库中的所有触发器,请

  • 我正在使用Envers来审核表,但它正在为未知/不存在的表创建一些审核表。它看起来像多对一关系的多对多关系审计表。 这是对的吗?如果是,为什么? 但当我尝试删除和HorarioFixo时,我遇到了一个错误。 我收到的错误: 这是SQL重复: 所有这些都是代码的一部分。如果你需要更多,请留下评论。 我的班级: 我的映射: 新罕布什尔州和恩维尔斯配置:

  • 错误: SQL错误[1843][22008]:ORA-01843:不是有效的月份值(6,'RR','SS','2019-06-19'),错误Msg=ORA-01843:不是有效的月份ORA-01843:不是有效的月份

  • 问题内容: 错误: 违反主键约束。 无法在对象中插入重复的密钥。 如何使第一行之后的主键递增? 我希望能够同时向此表添加项目列表,而不是将其插入RBAR。 谢谢您的帮助 问题答案: 仅对于此语句,ID将是顺序的,例如,如果ID为99,并且要插入4条记录,则ID为100、101、102、103。如果同时插入多个进程,则很容易违反约束,但是这并不是说,这比使用单条记录本质上不安全的情况要糟。