为用户关系插入mysql表
我有一个用于多对多用户关系的表(三列:relationship\u id、user\u id、user\u id)。当表接受任何条目时,如何保持关系的唯一性?当我有一排为用户关系插入mysql表,mysql,sql,relational-database,normalization,Mysql,Sql,Relational Database,Normalization,我有一个用于多对多用户关系的表(三列:relationship\u id、user\u id、user\u id)。当表接受任何条目时,如何保持关系的唯一性?当我有一排 221143 如何防止插入下一个id11 43,更重要的是插入下一个id43 11?当用户11请求与用户43的关系时,用户43必须不能请求与用户11的关系 如何在插入前检查两列 我的问题甚至更严重,因为我有两个表(请求和关系)。用户批准后,请求表中的一行将被删除并插入到关系中。使用两个表的原因是,许多挂起的请求使该表太长,应该定
221143
如何防止插入下一个id11 43
,更重要的是插入下一个id43 11
?当用户11请求与用户43的关系时,用户43必须不能请求与用户11的关系
如何在插入前检查两列
我的问题甚至更严重,因为我有两个表(请求和关系)。用户批准后,请求表中的一行将被删除并插入到关系中。使用两个表的原因是,许多挂起的请求使该表太长,应该定期使用该表来显示用户朋友
当从用户11向用户43插入请求时,检查表中是否存在
11 43
和43 11
行的最快有效方法是什么:请求和关系?以下是一些实现所需的选项(选择或组合哪个主要取决于您的数据模型、客户端体系结构和存储引擎):
- 在两个
列上创建一个user\u id
- 撤销
到INSERT
中,并为relationships
实现存储过程(这可以执行您想要的任何检查等),或者实现一个执行您想要的操作的存储过程INSERT
- 如果
s的顺序不相关,请更改用户id
代码,以便在插入
ing之前始终对这两个插入
s进行排序(例如通过存储过程方法)id
这样,您不需要进行明确的检查,但索引将为您完成所有工作 - 在
关系中创建第四列
,在插入触发器之前使用idcomb
唯一索引和
打开
,该触发器只需将
进行排序,并将它们与用户id
中间连接,并将其作为值分配给-
列……这样所有工作都完成了通过索引,不需要在客户端进行任何更改(当插入一些副本时,只是返回一个错误)idcomb
- 在两个
列上创建一个user\u id
- 撤销
到INSERT
中,并为relationships
实现存储过程(这可以执行您想要的任何检查等),或者实现一个执行您想要的操作的存储过程INSERT
- 如果
s的顺序不相关,请更改用户id
代码,以便在插入
ing之前始终对这两个插入
s进行排序(例如通过存储过程方法)id
这样,您不需要进行明确的检查,但索引将为您完成所有工作 - 在
关系中创建第四列
,在插入触发器之前使用idcomb
唯一索引和
打开
,该触发器只需将
进行排序,并将它们与用户id
中间连接,并将其作为值分配给-
列……这样所有工作都完成了通过索引,不需要在客户端进行任何更改(当插入一些副本时,只是返回一个错误)idcomb
创建视图vFriendRequests
作为
挑选
案例
当ID_1
然后,您可以执行与此视图不同的选择,以仅获取唯一的请求集。只要我使用了链接表为了跟踪多对多关系,我总是在插入新关系之前删除任何现有关系。但是,这在您的情况下可能不起作用,因为您的链接表包含代理键关系id。如果从链接表中删除代理键并使用stor你可以做你列出的每一件事 识别重复项使用案例逻辑创建视图
创建视图vFriendRequests
作为
挑选
案例
当ID_1
然后,您可以执行与此视图不同的选择,以仅获取唯一的请求集。请不要为同一问题打开新主题:@wildplasser这些是不同的主题,一个是关于表结构和如何插入,另一个是如何使用JOIN读取表(如果不更改表结构)。请不要为同一问题打开新主题:@wildplasser这些是不同的主题,一个是关于表结构和如何插入,另一个是如何使用JOIN读取表(如果不更改表结构)。 CREATE VIEW vFriendRequests AS SELECT CASE WHEN ID_1 < ID_2 THEN ID_1 ELSE ID_2 END CASE as RequestId_1, CASE WHEN ID_1 < ID_2 THEN ID_2 ELSE ID_1 END CASE as RequestId_2 FROM Friend_Requests_Table