Не удалось добавить ограничение внешнего ключа 2

#sql

Вопрос:

 CREATE TABLE Program(
    name VARCHAR(64) NOT NULL,
    abbreviation VARCHAR(16) NOT NULL,
    PRIMARY KEY (name)
);
 
 CREATE TABLE Student(
    ssn INTEGER CHECK (ssn > 0) NOT NULL,
    name VARCHAR(64) NOT NULL,
    login VARCHAR(16) NOT NULL,
    program VARCHAR(64) NOT NULL,
    PRIMARY KEY (ssn),
    FOREIGN KEY (program) REFERENCES Program(name),
    UNIQUE (login),
    UNIQUE (ssn, program)
);
 
 CREATE TABLE Branch(
    name VARCHAR(64) NOT NULL,
    program VARCHAR(64) NOT NULL,
    PRIMARY KEY (name),
    FOREIGN KEY (program) REFERENCES Program(name)
);
 
 CREATE TABLE BelongsTo(
    student INTEGER NOT NULL,
    branch VARCHAR(64) NOT NULL,
    program VARCHAR(64) NOT NULL,
    FOREIGN KEY (student, program) REFERENCES Student(ssn, program),
    FOREIGN KEY (branch, program) REFERENCES Branch(name, program)
);
 

Программа, Студент, Филиал успешно созданы. Но при создании belongsTo sql бросает:

Не удалось добавить ограничение внешнего ключа. Отсутствует индекс ограничения «belongsto_ibfk_2» в указанной таблице «ветвь»

Кроме того, мне нужно разработать схему в соответствии с: http://www.cse.chalmers.se/edu/year/2018/course/TDA357/VT2018/lab/task1.txt

Пожалуйста, не стесняйтесь спрашивать меня о более подробной информации об этой проблеме, заранее спасибо.

Комментарии:

1. Я удалил несогласованные теги базы данных. Пожалуйста, отметьте базу данных, которую вы действительно используете.

2. ПК Branch есть name , а не name, program есть . Вероятно, вы можете добавить уникальный ключ, как вы также сделали для student

Ответ №1:

Вам не нужен program student внешний ключ филиала или внешний ключ:

 CREATE TABLE BelongsTo(
    student INTEGER NOT NULL,
    branch VARCHAR(64) NOT NULL,
    program VARCHAR(64) NOT NULL,
    FOREIGN KEY (student, program) REFERENCES Student(ssn),
    FOREIGN KEY (branch) REFERENCES Branch(name)
);
 

Примечание: Определение student внешнего ключа работает, потому что у вас есть избыточное уникальное ограничение student(ssn, program) . Столбец ssn уже уникален, потому что это первичный ключ, поэтому программа всегда уникальна и для каждого учащегося (потому что есть только один из них).

Комментарии:

1. пожалуйста, взгляните на ссылку , нас просят разработать схему в соответствии с приведенными инструкциями. Хотя ваш ответ кажется правильным. Спасибо.