CREATE TABLE student 
 (
 s_id INTEGER  ,
 s_name VARCHAR2(80) ,
 s_email VARCHAR (80) ,
 FOREIGN KEY (s_id) REFERENCES classes (s_id)
 );
 CREATE TABLE teacher 
 (
 t_id INTEGER ,
 t_name VARCHAR2(80) ,
 t_email VARCHAR2 (80) ,
 FOREIGN KEY (t_id) REFERENCES classes (t_id)
 );
 CREATE TABLE courses
 (
 c_id INTEGER  ,
 c_title VARCHAR2 (25) ,
 c_describetion VARCHAR2 (25) ,
 FOREIGN KEY (c_id) REFERENCES classes (c_id)
 );
 CREATE TABLE classes
 (
 cl_name VARCHAR2 (30) ,
 cl_number INTEGER ,
 t_id INTEGER ,
 s_id INTEGER ,
 c_id INTEGER ,
 PRIMARY KEY (cl_number , t_id , s_id , c_id)
 );
  • Когда мне нужно создать эти таблицы (студент, преподаватель, курсы), у меня есть эта ошибка:
    Отчет об ошибке - ORA-02270: нет соответствующего уникального или первичного ключа для этого списка столбцов
    1. 00000 - "нет соответствующего уникального или первичного ключа для этого списка столбцов" * Причина: предложение REFERENCES в операторе CREATE / ALTER TABLE дает список столбцов, для которых не найдено ни одного уникального или основного ключевое ограничение в ссылочной таблице. * Действие: найдите правильные имена столбцов, используя ALL_CONS_COLUMNS просмотр каталога
0
M.sh411 22 Ноя 2019 в 19:48

2 ответа

Лучший ответ

Вы ссылаетесь на таблицу «классы» из трех других. Это те классы, которые должны ссылаться на них. Поместите FK в столбцы классов, ссылающиеся на поле «id» соответствующей таблицы. Кроме того, я думаю, вам нужно определить их как PK / UNIQUE.

1
nimsraw 22 Ноя 2019 в 16:57

Вы создаете внешние ключи наоборот. Вы хотите, чтобы classes имели внешние ключи, которые ссылаются на другие таблицы. Вам также необходимо определить первичные ключи в 3 главных таблицах, чтобы на них можно было ссылаться как на внешний ключ.

Кроме того, в MySQL нет VARCHAR2 типа данных (это тип данных, специфичный для Oracle): используйте взамен `VARCHAR.

Рассмотреть:

CREATE TABLE student (
    s_id INTEGER PRIMARY KEY,
    s_name VARCHAR(80),
    s_email VARCHAR(80)
);

CREATE TABLE teacher (
    t_id INTEGER PRIMARY KEY,
    t_name VARCHAR(80),
    t_email VARCHAR(80) 
);

CREATE TABLE courses (
     c_id INTEGER PRIMARY KEY,
     c_title VARCHAR(25),
     c_description VARCHAR(25) 
);

 CREATE TABLE classes (
     cl_name VARCHAR(30),
     cl_number INTEGER,
     t_id INTEGER,
     s_id INTEGER,
     c_id INTEGER,
     PRIMARY KEY (cl_number , t_id , s_id , c_id),
     FOREIGN KEY (s_id) REFERENCES student (s_id),
     FOREIGN KEY (t_id) REFERENCES teacher (t_id),
     FOREIGN KEY (c_id) REFERENCES courses (c_id)
);

Демонстрация DB Fiddle


Если вы используете Oracle (как показано в сообщении об ошибке в вашем вопросе), а не MySQL (которым вы пометили свой вопрос), тогда вы хотите VARCHAR2 вместо VARCHAR (что устарело). Остальная часть сценария остается прежней:

CREATE TABLE student (
    s_id INTEGER PRIMARY KEY,
    s_name VARCHAR2(80),
    s_email VARCHAR2(80)
);

CREATE TABLE teacher (
    t_id INTEGER PRIMARY KEY,
    t_name VARCHAR2(80),
    t_email VARCHAR2(80) 
);

CREATE TABLE courses (
     c_id INTEGER PRIMARY KEY,
     c_title VARCHAR2(25),
     c_description VARCHAR2(25) 
);

 CREATE TABLE classes (
     cl_name VARCHAR2(30),
     cl_number INTEGER,
     t_id INTEGER,
     s_id INTEGER,
     c_id INTEGER,
     PRIMARY KEY (cl_number , t_id , s_id , c_id),
     FOREIGN KEY (s_id) REFERENCES student (s_id),
     FOREIGN KEY (t_id) REFERENCES teacher (t_id),
     FOREIGN KEY (c_id) REFERENCES courses (c_id)
);

Демонстрация DB Fiddle

1
GMB 22 Ноя 2019 в 20:44