В нашей системе базы данных у нас есть поля для студентов и персонала. У них есть PersonnelCardId и StudentCardId, и мы сделали их первичным ключом. Затем у нас есть платежное устройство, которое содержит идентификатор карты, и мы объявили, что это внешний ключ. И мы не могли вставить строку в этом случае, и после исследования мы узнали, что мы не можем ссылаться на два первичных ключа на внешний ключ. Итак, как мы можем исправить эту ситуацию? Спасибо.
Две ссылки первичного ключа на внешний ключ
comment
любая таблица, которая является «дочерней» (например, имеет внешний ключ, указывающий на другую «родительскую» таблицу), ДОЛЖНА иметь соответствующую запись в родительской таблице, прежде чем вы сможете вставить ее в дочернюю. например создайте свои персональные и/или студенческие записи ДО того, как вы внесете их в таблицу платежей.
- person Marc B   schedule 21.12.2012
comment
Хорошо, наша проблема в том, что у нас есть два разных идентификатора карты, один — studentCardId, а другой — staffCardId в двух разных таблицах с именами «Студенты» и «Персонал», и мы объявили их первичными ключами. Таким образом, согласно вашему определению, если мы можем добавить совпадающую запись для одной таблицы, она не будет работать для другой таблицы. Итак, как мы можем решить эту проблему? Что мы должны изменить?
- person Figen Güngör   schedule 21.12.2012
Ответы (1)
Как вы сказали, внешний ключ не может одновременно ссылаться на две разные таблицы. С вашей текущей схемой внешний ключ cardID
может ссылаться только на PersonnelCardId
или StudentCardId
...
Если я правильно понимаю, ваша схема выглядит примерно так:
PersonnelCard
----------------
PersonnelCardID - PK
PersonnelCardFields
StudentCard
----------------
StudentCardID - PK
StudentCardFields
PaymentDevice
----------------
PaymentDeviceID - PK
CardID - FK
Чтобы решить эту проблему, вам нужно найти способ объединить таблицы PersonnelCard
и StudentCard
...
Card
----------------
CardID - PK
CardType - (Personnel or Student)
CardFields
FK в таблице PaymentDevice
теперь может ссылаться на PK в новой таблице Card
.
person
Michael Fredrickson
schedule
21.12.2012
На самом деле, мы не хотим объединять таблицы персонала и студентов, но мы придумали другое решение, которое заключается в том, что мы помещаем studentCardId и staffCardId в поле PaymentDevice в виде столбца, и мы хотим ограничить их таким образом, изменить таблицу PaymentDevice, добавить ограничение PaymentDevice_con check ((StudentCardID=NOT NULL AND PersonnelCardId=NULL) ИЛИ наоборот) ; однако, похоже, это не работает, так что вы думаете? Разве это не логично?
- person Figen Güngör; 21.12.2012
@user1463542 user1463542 При сравнении с
NULL
вы захотите использовать IS
вместо =
... (StudentCardID IS NOT NULL AND PersonnelCardId IS NULL)
- person Michael Fredrickson; 21.12.2012
@user1463542 user1463542 Вместо того, чтобы объединять таблицы
student
и personnel
, не могли бы вы все же создать новую таблицу card
и сделать так, чтобы personnel
и student
имели свои собственные FK для этой таблицы card
?
- person Michael Fredrickson; 21.12.2012