SQL Server具有PK和FK列

时间:2014-03-07 23:41:10

标签: sql-server foreign-key-relationship

我没有做太多的数据库设计工作,我正在寻找一些例子。 虽然我知道主键和外键之间的区别,但有一点让人措手不及的是,即使表有一个主键并且在另一个表中用作外键,因为我使用了GUI SSMS工具,注意到我有时候最终得到了这个

PhoneID (PK, int, not null) 

我的用户表

UserId(PK,FK, int, not null) 

这些表中有两个ID作为这些表中的主键,以及其他表中的外键,但为什么其中一个有“PK,FK”显然我不小心创建了它,但它应该是这样吗?

enter image description here

2 个答案:

答案 0 :(得分:1)

主键也可以同时成为外键。

但是看着你的数据库设计,在你的情况下我不认为它是故意的,它是错误地完成的。如果它没有被错误地完成那么你需要修复它。

dbo.PhoneType表中,列PhoneTypeID只需要是主键,而不是外键。我猜这是错误的,你想在dbo.Phone表中PhoneTypeIDPhoneTypeIDdbo.PhoneType列中创建一个外键。但不知何故,您最终会在dbo.Phontype表的主键列上创建外键约束。

此设计与约束相矛盾。

简单地说:dbo.PhoneType(PhoneTypeID)上的外键约束强制您在dbo.PhoneType表中没有PhoneTypeID,除非它存在于dbo.Phone表的PhoneTypeID列中。

另一方面,dbo.Phone(PhoneTypeID)上的外键约束强制您在dbo.Phone中不能拥有PhoneTypeID,除非它存在于dbo.PhoneType(PhoneTypeID)中。

,dbo.Users表中的UserID列也是如此。

<强>解决方案

  

您需要删除以下约束以使其正常工作。

     

1)在dbo.PhoneType表中删除外键约束引用   dbo.phone表中的PhoneTypeID列。

     

2)在dbo.Users Table中删除引用外键约束   dbo.phone表中的UserID列。

答案 1 :(得分:0)

这完全有可能,是的。表的主键也可以是引用另一个表的外键。

在你的情况下,我不确定你做了什么。您可以检查约束以查看UserId列引用的列。

作为补充说明,只是向表中添加外部引用不会隐式地使该列成为另一个表上的外键。例如,仅仅因为您将FK_PhoneTypeID添加到Phone表,SQL Server 不会自动将PhoneTypeID表中的PhoneType列设为FK 。在你的陈述中,某个地方,你可能会对其他列进行分配,甚至对自己进行分配。