Две ссылки первичного ключа на внешний ключ

В нашей системе базы данных у нас есть поля для студентов и персонала. У них есть PersonnelCardId и StudentCardId, и мы сделали их первичным ключом. Затем у нас есть платежное устройство, которое содержит идентификатор карты, и мы объявили, что это внешний ключ. И мы не могли вставить строку в этом случае, и после исследования мы узнали, что мы не можем ссылаться на два первичных ключа на внешний ключ. Итак, как мы можем исправить эту ситуацию? Спасибо.


person Figen Güngör    schedule 21.12.2012    source источник
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
comment
На самом деле, мы не хотим объединять таблицы персонала и студентов, но мы придумали другое решение, которое заключается в том, что мы помещаем studentCardId и staffCardId в поле PaymentDevice в виде столбца, и мы хотим ограничить их таким образом, изменить таблицу PaymentDevice, добавить ограничение PaymentDevice_con check ((StudentCardID=NOT NULL AND PersonnelCardId=NULL) ИЛИ наоборот) ; однако, похоже, это не работает, так что вы думаете? Разве это не логично? - person Figen Güngör; 21.12.2012
comment
@user1463542 user1463542 При сравнении с NULL вы захотите использовать IS вместо =... (StudentCardID IS NOT NULL AND PersonnelCardId IS NULL) - person Michael Fredrickson; 21.12.2012
comment
@user1463542 user1463542 Вместо того, чтобы объединять таблицы student и personnel, не могли бы вы все же создать новую таблицу card и сделать так, чтобы personnel и student имели свои собственные FK для этой таблицы card? - person Michael Fredrickson; 21.12.2012