Проверьте, есть ли в столбце 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)
);