我没有做太多的数据库设计工作,我正在寻找一些例子。 虽然我知道主键和外键之间的区别,但有一点让人措手不及的是,即使表有一个主键并且在另一个表中用作外键,因为我使用了GUI SSMS工具,注意到我有时候最终得到了这个
PhoneID (PK, int, not null)
我的用户表
UserId(PK,FK, int, not null)
这些表中有两个ID作为这些表中的主键,以及其他表中的外键,但为什么其中一个有“PK,FK”显然我不小心创建了它,但它应该是这样吗?
答案 0 :(得分:1)
主键也可以同时成为外键。
但是看着你的数据库设计,在你的情况下我不认为它是故意的,它是错误地完成的。如果它没有被错误地完成那么你需要修复它。
在dbo.PhoneType
表中,列PhoneTypeID
只需要是主键,而不是外键。我猜这是错误的,你想在dbo.Phone
表中PhoneTypeID
列PhoneTypeID
列dbo.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 。在你的陈述中,某个地方,你可能会对其他列进行分配,甚至对自己进行分配。