【问题标题】:Inserting Into and Maintaining Many-to-Many Tables插入和维护多对多表
【发布时间】:2014-06-09 04:26:20
【问题描述】:

SQLite3 用户。

我已经阅读了大量有关关系数据库和 SQL 的书籍,但没有一本说明如何维护多对多关系的链接表。我刚刚浏览了一本书,其中详细介绍了 SELECT 和 JOINS 的示例,但是当涉及多对多关系时,我就忽略了这一点。作者只是展示了一个表的一些伪代码,没有数据,然后是一个伪代码查询--WTF?我可能遗漏了一些东西,但它变得非常令人抓狂。

无论如何,假设我有一个类似 [People] 的表,其中包含 3 列:pID(主要)、姓名和年龄。具有 3 列的表 [Groups]:gID(主要)、组名和年份。由于人们可以属于多个组并且组可以有多个人,因此我设置了一个名为 [peoplegroups] 的链接表,其中包含两列:pID 和 gID,它们都来自各自的表。

那么,当在其他人上进行 INSERTING 时,我如何有效地将数据导入链接表,以及如何使用链接表将数据取出?

示例:我想将“Jane”插入 [people] 并使她成为组 gID 2“bowlers”的成员,同时更新链接表 {peoplegroups]。 稍后我想返回并列出所有投球手或一个人所属的所有组的列表。

【问题讨论】:

  • 当您需要新的会员资格时,您可以添加新记录。这到底是什么问题?

标签: sql select sqlite insert many-to-many


【解决方案1】:

如果您已经不使用主键和外键(您应该这样做!)我认为您可能还需要考虑在您的设计中使用触发器?因此,如果您有一组特定的规则(例如,如果您想创建 id = 1 的 Jane 并选择现有的组 2,那么在将 jane 插入到 people 后会自动在表 peoplegroups 中创建一个条目对 personid=1,groupid=2。您还可以创建具有特定选择的视图以查看您想要的数据,例如,如果您想要一个只显示人名和组名的查询,您可以创建一个视图“PeopleView”:

SELECT P.PersonName, G.GroupName
FROM People P
INNER JOIN PeopleGroup PG ON P.PersonID = PG.PersonID
INNER JOIN Group G ON G.GroupId = PG.GroupID

然后你可以查询'PeopleView'说

SELECT * FROM PeopleView WHERE GroupName = 'bowlers'

【讨论】:

  • 谢谢。我想我还需要更多地掌握 JOIN。
  • 所以我使用了这里提供的信息并学习和练习了 JOIN——“直到我的手指流血”——并为我创建的另一个数据库提出了这个:-- boldSELECT DeptName, EmpName FROM EmpDept JOIN Department ON EmpDept.[DeptID] = Department.[DeptID] JOIN Employee ON Employee.EmpID = EmpDept.[EmpID] ORDER BY EmpName;**bold** 感谢您的帮助。跨度>
【解决方案2】:

将新数据插入到提到的表中时,您所指的“链接”表需要包含来自其他表的两个主键作为外键。所以基本上 [People] 表 (pID) 和 [Groups] 表 (gID) 都应该是 [PeopleGroups] 表中的外键。为了在 [PeopleGroups] 中创建新的“链接”,在您尝试在 [PeopleGroups] 表中创建链接之前,该记录必须已经存在于 [People] 表以及 [Groups] 表中。我希望这会有所帮助

【讨论】:

  • 感谢您的回复。我正在使用主键和外键。我发现我不需要与其他表同时更新链接表。至于从这三个中提取数据,我从下面得到答案,然后我将练习掌握 JOINS,因为这似乎是我的主要“故障”。
猜你喜欢
  • 2014-06-27
  • 2021-10-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多