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