Двойная ссылка на таблицу в MySQL

Я пытался добавить ссылку на два столбца birth_country_id и home_country_id, которые связаны с таблицей countries.

Когда я выполняю следующий запрос, он выдает ошибку #1215 - Cannot add foreign key constraint

ALTER TABLE `users` 
    ADD CONSTRAINT `users_country_ids_foreign` 
    FOREIGN KEY 
        (`home_country_id`, `birth_country_id`) 
    REFERENCES `countries`(`id`, `id`) 
        ON DELETE SET NULL ON UPDATE NO ACTION;

PS: этот запрос автоматически генерируется PhpMyAdmin.

Что я делаю неправильно?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
135
2

Ответы 2

в этом случае вы можете попробовать добавить 2 отдельных ограничения для каждого столбца.

Вам нужно сгенерировать два отдельных внешних ключа. Вы хотите индивидуально проверить, существует ли страна, которую вы указали в home_country_id, и существует ли страна, которую вы указали в birth_country_id.

MySQL не поддерживает использование одного и того же столбца в индексе более одного раза (это техническая причина, по которой ваш оператор не работает), но если было бы будет разрешено, ваш внешний ключ будет проверять, что home_country_id и birth_country_id равны, что, вероятно, не то, что вы хотите выразить.

Дело в том, что у меня нет данных ни в одной из моих таблиц.

Ozan Kurt 23.03.2018 15:58

Значит, данные в таблицы помещать? Или это слишком очевидное решение? :П

Ethan Moore 23.03.2018 16:31

@OzanKurt Я не понимаю, что вы имеете в виду. Вам не нужны данные в ваших таблицах для добавления внешнего ключа, хотя, если у вас есть данные в users, вам также понадобятся страны, которые присваиваются всем вашим пользователям. Если у вас есть внешний ключ, а затем вставьте / обновите пользователя, например, home_country_id = 1, MySQL отклонит это, если у вас нет строки в таблице countries с id=1. (Но опять же, я не уверен, что вы имели в виду, или вы этого знаете.) Здесь важно следующее: вам нужны два отдельных ограничения, а не одно с двумя столбцами.

Solarflare 23.03.2018 18:25

Да, я так и думал. : D Ошибка, которую я получал, была без столбцов. Вместо этого я сделал (col1, col2) ссылки (ref1, ref2). Так что, если вы можете обновить ответ, было бы неплохо.

Ozan Kurt 23.03.2018 18:27

@OzanKurt references (ref1, ref2) - это совсем другая ситуация / вопрос. На него лучше всего можно было бы ответить, если бы вы добавили структуры таблиц (show create table xxx) для своих двух таблиц, а также (неработающий) оператор внешнего ключа в вопрос новый (хотя, вероятно, есть много похожих вопросов для этого более распространенного сценарий). Два наиболее вероятных подозрения: а) у вас нет индекса в целевой таблице, который начинается с (ref1, ref2), или б) типы данных не подходят. (Но, как было сказано ранее, на этот вопрос лучше всего ответить, посмотрев на структуру вашей таблицы).

Solarflare 23.03.2018 19:53

Другие вопросы по теме