sql - 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;
解决方案
检查 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)
);
推荐阅读
- php - 在 Drupal 中,如果一个字段为空,则使用另一个字段作为返回值。正确的语法?
- git - 启动后向容器实例 (Docker) 发送文件
- python - Django测试找不到现有的数据库表
- sql - “表达式不正确或太复杂”
- shopware - 在 Shopware 中编辑主页
- java - 蛇类命名约定
- java - com.google.common.collect.Iterables 和实例类型
- apache-spark - SparkSQL 在窗口规范中没有正确排序
- android - Android 中 5 秒后的 Toast 消息
- highcharts - Highcharts 注释 - 如何按轴点绘制矩形?