Две първични ключови препратки към външен ключ

В нашата система от бази данни имаме полета за студенти и персонал. Те имат PersonnelCardId и StudentCardId и ние им направихме първичен ключ. След това имаме платежно устройство, което съдържа cardID и декларирахме, че това е външен ключ. И не можахме да вмъкнем ред в този случай и след проучване научихме, че не можем да препратим два първични ключа към външен ключ. И така, как можем да поправим тази ситуация? Благодаря.


person Figen Güngör    schedule 21.12.2012    source източник
comment
всяка таблица, която е „дете“ (напр. има външен ключ, сочещ към друга „родителска“ таблица) ТРЯБВА да има съответстващ запис в родителската таблица, преди да можете да вмъкнете в дъщерната. напр. създайте вашите записи за персонал и/или студенти, ПРЕДИ да бъдете въведени в таблицата за плащания.   -  person Marc B    schedule 21.12.2012
comment
Добре, проблемът ни е, че имаме два различни ID на картата, едната е studentCardId, а другата е personnelCardId в две различни таблици с име Students и Personnels и ние ги обявихме за първични ключове. Така че според вашата дефиниция, ако можем да добавим съответстващ запис за една таблица, той ще се провали за друга таблица. И така, как можем да поправим този проблем? Какво трябва да променим?   -  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
Всъщност ние не искаме да комбинираме таблици personnel и students, но измисляме друго решение, което е, че поставяме studentCardId и personnelCardId в полето PaymentDevice като колона и искаме да ги ограничим по този начин, променяме таблицата PaymentDevice добавяне на ограничение PaymentDevice_con проверка ((StudentCardID=NOT NULL И PersonnelCardId=NULL) ИЛИ обратното) ; въпреки това изглежда не работи, така че какво мислите? Не е ли логично? - person Figen Güngör; 21.12.2012
comment
@user1463542 Когато сравнявате с NULL, ще искате да използвате IS вместо =... (StudentCardID IS NOT NULL AND PersonnelCardId IS NULL) - person Michael Fredrickson; 21.12.2012
comment
@user1463542 Вместо да комбинирате таблиците student и personnel, можете ли все пак да създадете нова таблица card и personnel и student да имат свои собствени FK към тази card таблица? - person Michael Fredrickson; 21.12.2012