首页 > 解决方案 > Oracle SQL 错误

问题描述

我对 SQL 很陌生,到目前为止,我的班级正在使用 Oracle 云。我已经创建了表,并且正在尝试将数据插入其中。ORA-02291: integrity constraint violated当我尝试将数据插入学期表时,我不断收到错误消息。任何帮助将不胜感激。谢谢!

CREATE TABLE SCHOOL (
  SchoolID              char(10)        NOT NULL,
  SchoolName            char(50)        NOT NULL,
  SchoolAddress         char(50)        NOT NULL,
  SchoolCity            char(50)        NOT NULL,
  SchoolState           char(2)         NOT NULL,
  SchoolZIP             char(30)        NOT NULL,
  SchoolPhone           char(25)        NULL,
  SchoolWebsite         char(50)        NOT NULL,
    CONSTRAINT SCHOOL_PK PRIMARY KEY(SchoolID)
);

CREATE TABLE SEMESTER(
SemesterName            char(20)        NOT NULL,
Year                char(4)         NOT NULL,
SchoolID            char(50)        NOT NULL,
    CONSTRAINT SEMESTER_PK PRIMARY KEY(SemesterName),
        CONSTRAINT SEM_SCH_FK FOREIGN KEY(SchoolID)
            REFERENCES SCHOOL(SchoolID)
);

/****************************** School ******************************************/
INSERT INTO SCHOOL(SchoolID, SchoolName, SchoolAddress, SchoolCity, SchoolState, SchoolZip, SchoolPhone, SchoolWebsite)
    VALUES(
        'NIU', 'Northern Illinois University', '1425 Lincoln Hwy', 'Dekalb', 'IL', '60115', '815-753-0446', 'https://myniu.niu.edu/');
SELECT * FROM SCHOOL;

/****************************** Semester ****************************************/

INSERT INTO SEMESTER(SemesterName, Year, SchoolID)
    VALUES(
        'Spring', '2020', 'NIU');
INSERT INTO SEMESTER VALUES(
        'Fall', '2020', 'NIU');
SELECT * FROM SEMESTER; 

标签: sqloracle

解决方案


检查 SCHOOLID 列中是否有尾随空格

select schoolid, length(schoolid) from school;

您很可能会看到长度为 10 而不是 3 :

|SCHOOLID   |LENGTH(SCHOOLID) |
|NIU        |10               |


下面是一个很好的解释(在此引用Tom Kyte

varchar2 数据类型在存储在数据库表中时,仅使用分配给它的空间。如果您有一个 varchar2(1999) 并在表中放入 50 个字节,我们将使用 52 个字节(前导长度字节)。

char 数据类型,当存储在数据库表中时,始终使用最大长度并填充空白。如果您有 char(1999) 并将 50 个字节放入其中,它将消耗 2001 个字节(前导长度字段也存在于 char 上)。

在数据库中——一个 CHAR 是一个 VARCHAR,它被空白填充到它的最大长度。

char(1999) 和 varchar2(1999) 之间存在很大差异,因为 CHAR 在物理和逻辑上始终是 1999 个字符。varchar 物理上是 1999 字节,但逻辑上可以是 0 到 1999 之间的任何大小。char 总是填充空白,而 varchar 则不然。


将列定义为 varchar2 时,看看错误是否仍然存在,如下..


CREATE TABLE SCHOOL (
  SchoolID             varchar2(10)        NOT NULL,
  SchoolName           varchar2(50)        NOT NULL,
  SchoolAddress        varchar2(50)        NOT NULL,
  SchoolCity           varchar2(50)        NOT NULL,
  SchoolState          varchar2(2)         NOT NULL,
  SchoolZIP            varchar2(30)        NOT NULL,
  SchoolPhone          varchar2(25)        NULL,
  SchoolWebsite        varchar2(50)        NOT NULL,
    CONSTRAINT SCHOOL_PK PRIMARY KEY(SchoolID)
);

CREATE TABLE SEMESTER(
SemesterName            varchar(20)        NOT NULL,
Year                varchar(4)         NOT NULL,
SchoolID            varchar(50)        NOT NULL,
    CONSTRAINT SEMESTER_PK PRIMARY KEY(SemesterName),
        CONSTRAINT SEM_SCH_FK FOREIGN KEY(SchoolID)
            REFERENCES SCHOOL(SchoolID)
);

推荐阅读