Создание внешних ключей (add foreign key) в MySQL

Следующий пример взят из официальной документации по MySQL с небольшими изменениями.

alex@akmurzin:~
mysql
CREATE TABLE parent (
    id INT(8) NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;
 
CREATE TABLE child (
    id INT,
    parent_id INT(8),
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=INNODB;

Внешние ключи должны удовлетворять нескольким условиям

  • Источником основных данных является родительская (parent) таблица, на которые будет ссылаться дочерняя (child). Обе таблицы должны быть одного типа (InnoDB).
  • Исходная колонка и ссылающаяся на неё должны быть схожих типов. Размер и знак целочисленных типов должны строго совпадать. Длина для строковых типов не обязана однозначно соответствовать.
  • MySQL требует наличия индексов по соответствующим колонкам как родительской, так и дочерней таблицы. Это нужно, чтобы проверка внешних ключей проходила быстро, без полного сканирования таблиц.
  • При указании [ON UPDATE|ON DELETE] CASCADE обновление или удаление записей в родительской таблице приводит к аналигичным действиям в дочерней. Условие RESTRICT блокирует удаление или обновление записей из родительской таблицы, на которые есть ссылки в дочерней, это значение действует по умолчанию, то есть его можно не указыть явно.

Если требуется добавить внешний ключ к уже существующей таблице, следует выполнить запрос ALTER TABLE child ADD FOREIGN KEY (parent_id).