在向我显示重复项之前,请注意,我已经在网站上进行搜索,发现了 一些 示例,但并非完全针对我的问题:)
在SQL中创建 友谊 表的最佳方法是什么,但是要确保每行都是唯一的,因为无论它们属于哪一列,相同的UserID和FriendID都不会被允许?
我有这个粗略的例子
CREATE TABLE [dbo].[Friendship]( [UserID] [uniqueidentifier] NOT NULL, [FriendID] [uniqueidentifier] NOT NULL, [FriendshipStatus] [int] NOT NULL )
并有2个外键,分别来自UserID和FriendID。
不过目前,我可以在用户之间插入 两次 Friendship ,从而创建一个副本。例子
UserID FriendID FriendshipStatus Guid 123 Guid 789 1 Guid 789 Guid 123 1
我如何确保强制执行此完整性,也许是 2个PK ?某种 独特的索引 ?还是您会建议一个更好的餐桌设计?另外,您会自动增加FriendshipID吗?如果是这样,您能解释为什么吗?
FriendshipID
使该FRIENDSHIP表的主键为:
FRIENDSHIP
…将确保您不能有重复的订单。意思是,它将阻止您添加用户标识“ 123”和友好标识“ 789”的重复项。如果包含状态列,则不再是这种情况,因为不同的状态值将允许userid和friendid列的重复。
为了停止反向对-用户标识“ 789”和友好标识“ 123”,您需要包含逻辑以检查该对在存储过程,函数或触发器中是否已存在于表中。如果还不存在相反的条件,则userid <friendid的CHECK约束将停止添加userid“ 789”和friendid“ 123”的有效尝试。
INSERT INTO FRIENDSHIP SELECT @userid, @friendid, 1 FROM FRIENDSHIP f WHERE NOT EXISTS(SELECT NULL FROM FRIENDSHIP t WHERE (t.userid = @friendid AND t.friendid = @userid) OR (t.userid = @userid AND t.friendid = @friendid)