В нашата система от бази данни имаме полета за студенти и персонал. Те имат PersonnelCardId и StudentCardId и ние им направихме първичен ключ. След това имаме платежно устройство, което съдържа cardID и декларирахме, че това е външен ключ. И не можахме да вмъкнем ред в този случай и след проучване научихме, че не можем да препратим два първични ключа към външен ключ. И така, как можем да поправим тази ситуация? Благодаря.
Две първични ключови препратки към външен ключ
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
Всъщност ние не искаме да комбинираме таблици personnel и students, но измисляме друго решение, което е, че поставяме studentCardId и personnelCardId в полето PaymentDevice като колона и искаме да ги ограничим по този начин, променяме таблицата PaymentDevice добавяне на ограничение PaymentDevice_con проверка ((StudentCardID=NOT NULL И PersonnelCardId=NULL) ИЛИ обратното) ; въпреки това изглежда не работи, така че какво мислите? Не е ли логично?
- person Figen Güngör; 21.12.2012
@user1463542 Когато сравнявате с
NULL
, ще искате да използвате IS
вместо =
... (StudentCardID IS NOT NULL AND PersonnelCardId IS NULL)
- person Michael Fredrickson; 21.12.2012
@user1463542 Вместо да комбинирате таблиците
student
и personnel
, можете ли все пак да създадете нова таблица card
и personnel
и student
да имат свои собствени FK към тази card
таблица?
- person Michael Fredrickson; 21.12.2012