Iva*_*ers 3 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 ) ;
Run Code Online (Sandbox Code Playgroud)
现在,我的所有表都像这样设置并且完美工作,但是当我尝试在我的方案上插入时,它说我正在尝试将 null 插入到主键 schema_ID 中。
我将向您展示我使用的 2 个 SQL 插入。一份用于私人教练,一份用于计划。
INSERT INTO Personal_Trainer (name, loginname, date_of_birth, password)
VALUES('Bojan', 'Bojan', '15-07-1974','fitline');
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试插入此命令时,我收到此错误消息:
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 ) ;
Run Code Online (Sandbox Code Playgroud)
这是我的私人教练表。
您需要为 提供唯一的非空值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
);
Run Code Online (Sandbox Code Playgroud)
遗憾的是,在早期的 Oracle 版本中,此选项不可用。惯用的解决方案是声明一个序列:
CREATE SEQUENCE scheme_id_seq;
Run Code Online (Sandbox Code Playgroud)
也可以直接使用它:
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);
Run Code Online (Sandbox Code Playgroud)
或者创建一个触发器来自动填充它:
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;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18132 次 |
最近记录: |