2015-06-03 2 views
1

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

CREATE TABLE student(
s_id int AUTO_INCREMENT, 
name varchar(30) NOT NULL, 
PRIMARY KEY(s_id) 
) 

CREATE TABLE section(
sec_id int AUTO_INCREMENT, 
name varchar(2) NOT NULL, 
PRIMARY KEY(sec_id) 
) 


CREATE TABLE advisor(
ad_id int AUTO_INCREMENT, 
name varchar(2) NOT NULL, 
PRIMARY KEY(ad_id) 
) 

ответ

0

Если студента может иметь самый больший одинсоветника, то это отношения один-ко-многим.

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

ALTER TABLE student ADD ad_id INT COMMENT 'fk ref advisor'; 

Кроме того, некоторые устройства хранения данных, такие как InnoDB, поддерживают и применяют внешние ключи. То есть, мы можем заставить базу данных вводить ограничения (ограничения) на значения, которые могут быть сохранены в столбцах, определенных как внешние ключи.

Например, мы можем установить правило, которое гласит, что значение, которое хранится в ad_id столбце в таблице student ... должны быть найдено в строке в таблице advisor, в ad_id колонки.

Например:

ALTER TABLE student ADD CONSTRAINT fk_student_advisor 
    FOREIGN KEY (ad_id) REFERENCES advisor(ad_id) 
    ON DELETE RESTRICT ON UPDATE CASCADE 

Это также обеспечивает соблюдение правила, что строка из таблицы advisor не может быть удалена, если есть строки в таблице student, которые ссылаются на это.

Этот же шаблон можно повторить для любого отношения «один ко многим». Например, если ученик может быть связан с не более один раздел, мы можем добавить внешний ключ таким же образом.

Если есть много-ко-многим, то мы вводим отношений таблицу, которая имеет внешние ключи, ссылающиеся на две связанные Entity таблицы.

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

Мы можем ввести новую таблицу, как это (в качестве примера):

CREATE TABLE student_section 
(student_id INT NOT NULL COMMENT 'pk, fk ref student' 
, section_id INT NOT NULL COMMENT 'pk, fk ref section' 
, PRIMARY KEY (student_id, section_id) 
, CONSTRAINT fk_student_section_student 
    FOREIGN KEY student_id REFERENCES student(s_id) 
    ON DELETE CASCADE ON UPDATE CASCADE 
, CONSTRAINT fk_student_section_section 
    FOREIGN KEY section_id REFERENCES section(sec_id) 
    ON DELETE CASCADE ON UPDATE CASCADE 
) 

При том, что вместо того, чтобы установить связь между студентом и разделом мы вставить строку в новая таблица student_section. Если ученик связан с другим секцией, мы добавляем еще одну строку в таблицу, ссылаясь на того же студента, но на другой раздел.

Значение, хранящееся в столбце student_id, относится к строке в таблице student; и значение, хранящееся в столбце section_id, относится к строке в таблице section.

(Отношение «многие ко многим» действительно состоит из строк в новой таблице, которая имеет отношение «один ко многим» к двум другим таблицам.)