Внешние ключи не заполнены - PullRequest
0 голосов
/ 08 апреля 2020

Итак, у меня возникла странная проблема, когда мои внешние ключи иногда имеют значения, и когда я возвращаюсь к ним, они снова становятся нулевыми.

Я дважды проверил синтаксис и отношения, но они Вы просто не даете мне значения.

Это код, с которым он работал, но теперь все внешние ключи имеют нулевое значение. Родительские таблицы представляют собой заполненные первичные ключи и отдельный набор значений, которые соответствуют данным в my_contacts. Я все еще оставил столбцы в my_contacts с исходными данными, которые эти родительские таблицы должны заменить. Я думаю, что должен быть какой-то код, чтобы сказать ему, чтобы он посмотрел на столбец профессии в my_contacts, а затем присвоил значению prof_id значение, соответствующее таблице prof_id, но он делал это автоматически, а затем останавливался. Единственное, что я сделал, это осмотр другой таблицы с помощью «SELECT *». Любая помощь будет с благодарностью. Заранее спасибо!

ALTER TABLE my_contacts

ADD COLUMN prof_id INT DEFAULT NULL,

ADD COLUMN  zip_code INT DEFAULT NULL,

ADD COLUMN status_id INT DEFAULT NULL,

ADD CONSTRAINT fk_prof_my_contacts 
  FOREIGN KEY (prof_id) 
  REFERENCES profession (prof_id),

ADD CONSTRAINT fk_status_my_contacts 
    FOREIGN KEY (status_id) 
    REFERENCES status (status_id),

ADD CONSTRAINT fk_zip_my_contacts 
  FOREIGN KEY (zip_code) 
  REFERENCES zip_code (zip_code);

1 Ответ

0 голосов
/ 08 апреля 2020

Ваше мышление неверно.

Нет волшебников c, которые заполняют столбцы внешнего ключа.

Когда эти столбцы были добавлены, им было присвоено значение NULL (из-за DEFAULT Предложение NULL в определениях столбцов.)

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

Внешний ключ (как определено, как показано в вопросе), по умолчанию ON UPDATE NO ACTION ON DELETE NO ACTION.

И значение по умолчанию NO ACTION эквивалентно указанию RESTRICT. Это означает, что если в таблице my_contacts есть какие-либо строки со значениями prof_id, которые ссылаются на строку в таблице profession, то попытка УДАЛИТЬ указанную строку из таблицы profession приведет к ошибке. Кроме того, любая попытка изменить значение столбца prof_id указанной строки в profession приведет к ошибке. Эти действия будут нарушать правила, установленные ограничением внешнего ключа.


Связь между строками устанавливается путем сохранения общего значения в столбце prof_id двух таблиц. Хранение ненулевого значения в столбце prof_id связывает строку в my_contacts со строкой в ​​profession.

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

Ограничение внешнего ключа не вызывает автоматическое присвоение значений c для замены значений NULL в prof_id столбец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...