Добавление внешнего ключа в существующую таблицу SQL

На днях столкнулся с проблемой добавления в таблицу поля, которое было бы внешним ключом для другой таблицы. Речь идет именно о таблице, в которой уже есть заполненные поля. Перечитав несколько источников и перепробовав несколько вариантов, определил для себя работающий (не знаю правда оптимальный он или нет), который и перенесу сюда чтобы не забыть, а возможно он пригодится ещё кому-то ) Итак, запрос:

ALTER TABLE articles ADD subcategoryId SMALLINT(4) NOT NULL DEFAULT 4;
ALTER TABLE articles ADD FOREIGN KEY (`subcategoryId`) REFERENCES subcategories(`id`);

В первом запросе для таблицы articles мы создаем поле subcategoryId, которое будет выступать внешним ключом. Тут очень важны два момента. Во-первых - тип данных создаваемого столбца должен в точности совпадать с тем, на который он будет ссылаться как внешний ключ (вплоть до количества символов и установленного значения NOT NULL). И во-вторых - нужно установить в качестве дефолтного значения одно из существующих значений того столбца, на который мы будем ссылаться, чтобы в уже существующие записи было введено корректное значение нового внешнего столбца.
Второй запрос это собственно назначение нашего новосозданного столбца внешним ключом.

Comments

vedro-compota's picture

ещё интересно использовать ON UPDATE + ON DELETE -- чтобы явно прописать поведение СУБД, на случай если "родитель" этой записи во внешней таблице будет удалён или модифцицирован.

_____________
матфак вгу и остальная классика =)

Voronve's picture

Спасибо, учтем!