我正在创建BOOK_Issue表,其中将包含发布该书的人员的ID。 我有一个名称为user_id的女巫将包含来自tbl_student的id以及tbl_faculty。所以如何参考两个主键列来设置book_issue表的user_id字段。如何引用具有多个主键列的一个外键列
回答
创建一个“person”超类,它可以是“student”类型或type“faculty”类型。请参考此而不是BOOK_Issue
表。
基本上要创建这种关系,您需要一个跨越“学生”和“教师”的唯一ID。把它放在一个表格中(tbl_person
?),并在tbl_student
和tbl_faculty
的每一行中引用这个新表格。这可能也是最好的,然后拉出tbl_student
和tbl_faculty
中的字段,然后将它们放在这个新的超类中。
您可以通过在BOOK_Issue表中的user_id旁边添加一个额外的列来解决问题,该列指示这是学生ID还是Faculty ID。
或者,ID本身可能很容易包含某些表明其性质的模式(例如,没有所有的教师ID可能以“UC”开始,并且学生ID都不是这样)。
两个解决方案上面然后允许使用类似于以下
SELECT B.*,
CASE B.BorrowerType -- could be LEFT(user_id, 2) etc...
WHEN 'S' THEN S.Name
WHEN 'F' Then F.Name
END As Name,
CASE B.BorrowerType
WHEN 'S' THEN S.PhoneNumber
WHEN 'F' Then F.Phone -- Note that these constructs allow
-- mapping distinct columns names etc.
END As PhoneNr
FROM BOOK_Issue B
LEFT JOIN tbl_student S ON B.BorrowerType = 'S' AND B.user_id = S.id
LEFT JOIN tbl_faculty F ON B.BorrowerType = 'F' AND B.user_id = F.id
WHERE B.DueDate < '11/23/2009' -- or some other condition
这种查询可以得到一个有点沉重,当我们需要从学生/教师表得到多列。一种可能的选择是UNION,但是这会导致重复搜索条款。
最后,在所有DBMS上不能使用的最佳解决方案是由“IF B.BorrowerType ='S'”条件驱动的子查询。
您的数据库模式不正确。
如果您期望唯一的ID,那么它们应该在一个表中。
您可以创建一个包含所有用户的表格,并设置一个列来设置其类型(学生,教师)。然后根据每个用户的类型为每个用户创建2个不同的表格。
这应该是你的表设计:
FacultyTable(FacultyID,FacultyName) StudentsTable(StudentID,StudentName,FacultlyID,...) BookTable(的BookID,BOOKNAME,...) UsersTable(用户名,用户名,userPassword的,StudentID,LastLogin,...)
现在,这是主要的事情:
BookIssedTable(BookIssedID,的BookID,用户名) //此表告诉我,一本书的BookID的“颁布给“用户ID”的用户//这可以更好,因为这对初始设计来说肯定是一个很大的改进。
- 1. 引用同一主键的一个表的多个列的外键?
- 2. 具有包含2列的主键的表的外键引用
- 3. 具有主键的两列而不是具有一个主键的两列
- 4. 怎么能一个多主键的一列被用作外键
- 5. Laravel将外键引用移动到具有两列的主键?
- 6. 如何将一个外键变为主键和列成列
- 7. 如何创建指向多列主键的单个外键?
- 8. 创建具有复合主键的表引用两个外键
- 9. 引用同一个表的一列中的多个外键
- 10. 一个多列VS单柱的多个外键外键
- 11. MySQL的 - 引用一个外键的多种可能的主键
- 12. 如何使主键是一个外键和列的组合
- 13. 如何加入多个列只有一个外键使用LINQ
- 14. 具有相同唯一列的表的主键或外键
- 15. 对外键的两个主键引用
- 16. 多列外键引用
- 17. 有可能引用一列作为多个外键
- 18. 如何创建引用另一个由多个外键组成的主键的外键?
- 19. 多个主/外键
- 20. 复合外键引用一个或多个列
- 21. 我应该选择具有索引主键和键的唯一列具有多个值?
- 22. 具有多列的DataSet和主键
- 23. Nhibernate:外键必须与引用的主键具有相同的列数
- 24. 外键必须与引用的主键具有相同的列数
- 25. 一个外键引用不同表的两个主键?
- 26. SQL,两个外键引用另一个表的相同主键
- 27. 创建具有多个主键列和引用外键的数据库时出错
- 28. 只能有一个外键引用主键吗?
- 29. 引用复合主键的一列作为外键
- 30. 解析&Swift:具有多个键的列