один и тот же внешний ключ для двух разных первичных ключей - PullRequest
0 голосов
/ 13 сентября 2018

Моя проблема в том, что я не знаю и не могу понять, возможно ли иметь два разных первичных ключа, ссылающихся на один и тот же ключ.Чтобы быть более конкретным, у меня есть три таблицы.Первая таблица называется staff с атрибутами: id fname lname password.Вторая таблица называется student с атрибутами: id fname lname password role и, наконец, третья таблица, которая называется message и имеет 4 атрибута: id text date user_fk, и я хочу, чтобы два первичных ключа ссылались на ключ foreighn.В phpmyadmin это довольно просто, и я сделал это.Проблема в том, что, когда я хочу ввести новую строку, база данных, я полагаю, не может определить, является ли первичный ключ из таблицы персонала или из студента.Я получаю сообщение: #1452 - Cannot add or update a child row: a foreign key constraint fails ( dis . message , CONSTRAINT student_fk FOREIGN KEY ( user_fk ) REFERENCES student ( studentid )).Итак, мой вопрос: это совершенно неправильно, что я хочу сделать?Может быть, будет лучше создать, например, другую таблицу, в которой будут храниться только иностранные ключи?Или ошибка в другом месте, что я не могу ее найти?Спасибо!

1 Ответ

0 голосов
/ 13 сентября 2018

Если я правильно вас понимаю, внешний ключ user_fk в message относится к student и staff идентификаторам.

В этом случае, если вы попытаетесь вставить данные в messagetable, он проверит обе таблицы student и staff для этого идентификатора.Отсюда ошибка.

Что вы можете сделать, это добавить два столбца внешнего ключа в message по одному для каждой указанной таблицы.

Обновление

Вышеуказанный подход приведет к возможности использования внешних ключей, допускающих нулевое значение.Вместо этого мы можем иметь две таблицы сопоставления, по одной для каждой таблицы.например: student_message_map и staff_message_map.Каждая таблица будет содержать 2 внешних ключа student_id и message_id / staff_id и message_id.

. Это сделает столбцы не обнуляемыми, но для запроса потребуется выполнить два объединения.Кроме того, кто-то, смотрящий на это отношение, может подумать, что это отношение «многие ко многим» из-за таблиц сопоставления.

ИМО, имеющий внешний ключ, допускающий значение NULL, не является плохой практикой, вам просто нужно знать, спрашивая, о возможностинулевых значений.

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