插入并维护多对多表

时间:2014-04-24 03:56:57

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

SQLite3用户。

我已阅读过大量有关关系数据库和SQL的书籍,但没有一本关于如何维护多对多关系的链接表。我刚刚阅读了一本书,其中详细介绍了SELECT和JOINS的示例,但是当涉及到多对多关系时,它会在同一时间内进行掩饰。作者只显示了一些表的伪代码,没有数据,然后是伪代码查询 - WTF?我可能错过了一些东西,但它变得非常令人发狂。

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

那么,当我对其他人进行INSERTING时如何有效地将数据输入到链接表中?如何使用链接表获取数据?

示例:我想将“Jane”插入[people]并让她成为群组gID 2,“bowlers”的成员,并同时更新链接表{peoplegroups]。 后来我想回去拿出所有投球手或一个人参加的所有团体的名单。

2 个答案:

答案 0 :(得分:0)

如果您已经不使用主键和外键(您应该使用它!)我认为您可能还需要考虑在设计中使用触发器?因此,如果您有一组特定的规则(例如,如果您想创建具有id = 1的Jane并选择现有的组2,那么在插入jane之后,人们会自动在表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'

答案 1 :(得分:0)

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