所以,我有一个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 ) ;
这是我的私人教练表。
答案 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表创建类似的触发器。