2012-12-21 125 views
1

在我们的数据库系统中,我们有学生和人员领域。他们有PersonnelCardId和StudentCardId,我们把它们作为主键。然后我们有一个支付cardID的支付设备,我们宣布它是一个外键。我们不能在这种情况下插入一行,并且在研究之后,我们了解到我们不能将两个主键引用到外键。那么我们如何解决这种情况呢?谢谢。对外键的两个主键引用

+3

任何作为'子'的表(例如,有一个外键指向另一个'父'表)必须在父表中有一个匹配的记录,然后才能插入到子中。例如创建您的人事和/或学生记录之前,你没有进入支付表。 –

+0

Okey,我们的问题是我们有两个不同的Card ID,一个是studentCardId,另一个是名为StudentsCardId的两个不同的表名为Students和Personnels,我们将它们声明为主键。所以根据你的定义,如果我们可以为一个表添加一个匹配的记录,它将失败的另一个表。那么我们该如何解决这个问题呢?我们应该改变什么? –

回答

5

正如你所说的,一个外键不能同时引用两个不同的表。根据您目前的架构中,cardID外键只能引用要么PersonnelCardIdStudentCardId ...

如果我理解正确的话,你的架构看起来像:

PersonnelCard 
---------------- 
PersonnelCardID - PK 
PersonnelCardFields 


StudentCard 
---------------- 
StudentCardID - PK 
StudentCardFields 


PaymentDevice 
---------------- 
PaymentDeviceID - PK 
CardID - FK 

要解决这个问题,你必须找到一种方法,在PersonnelCardStudentCard表结合...

Card 
---------------- 
CardID - PK 
CardType - (Personnel or Student) 
CardFields 

的FK在PaymentDevice表,现在可以在新的引用PK表。

+0

实际上,我们不希望将人员和学生表结合在一起,但我们想出了另一个解决方案,即我们将studentCardId和personnelCardId作为列放入PaymentDevice字段,并且想要像那样约束它们,alter table PaymentDevice add constraint PaymentDevice_con检查((StudentCardID = NOT NULL AND PersonnelCardId = NULL),反之亦然);然而,它似乎不工作,所以你怎么看?这不合乎逻辑吗? –

+1

@ user1463542与'NULL'比较时,您需要使用'IS'而不是'='...'(StudentCardID不为NULL且PersonnelCardId为NULL)' –

+2

@ user1463542而不是将'student'和'人员'表,你还可以创建一个新的'卡'表,并且'人员'和'学生'拥有他们自己的FK到这张卡表吗? –