Oracle SQL Ошибки - PullRequest
       0

Oracle SQL Ошибки

0 голосов
/ 03 апреля 2020

Я очень плохо знаком с 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; 

1 Ответ

2 голосов
/ 03 апреля 2020

Проверьте, есть ли в столбце 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 - это пустой VARCHAR дополняется до максимальной длины.

Между char (1999) и varchar2 (1999) существуют большие различия, поскольку CHAR всегда имеет длину 1999 символов физически И логически. varchar - это физически 1999 байт, но логически он может иметь любой размер в диапазоне от 0 до 1999. Символ всегда заполнен пробелом, в отличие от 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)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...