Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新数据库,或者假设您的代码没有插入或更新错误,希望一切顺利。@lollercoaster:我和一个没有名字的马都倾向于PostgreSQL,而且它有更好的功能集,PostgreSQL也有递归CTE,这对于图形和树工作可能很方便。如果您想坚持使用MySQL_Mysql_Database Design - Fatal编程技术网

更新数据库,或者假设您的代码没有插入或更新错误,希望一切顺利。@lollercoaster:我和一个没有名字的马都倾向于PostgreSQL,而且它有更好的功能集,PostgreSQL也有递归CTE,这对于图形和树工作可能很方便。如果您想坚持使用MySQL

更新数据库,或者假设您的代码没有插入或更新错误,希望一切顺利。@lollercoaster:我和一个没有名字的马都倾向于PostgreSQL,而且它有更好的功能集,PostgreSQL也有递归CTE,这对于图形和树工作可能很方便。如果您想坚持使用MySQL,mysql,database-design,Mysql,Database Design,更新数据库,或者假设您的代码没有插入或更新错误,希望一切顺利。@lollercoaster:我和一个没有名字的马都倾向于PostgreSQL,而且它有更好的功能集,PostgreSQL也有递归CTE,这对于图形和树工作可能很方便。如果您想坚持使用MySQL,那么从触发器引发异常的“标准”方法是,AFAIK,触发某种非法操作;类似这样的东西可能会很好地工作,但不会太难看:将较小值的id作为用户_id1如何帮助?@lollercoaster:这样可以避免重复。无向意味着(1,2)和(2,1)是同一条



更新数据库,或者假设您的代码没有插入或更新错误,希望一切顺利。@lollercoaster:我和一个没有名字的马都倾向于PostgreSQL,而且它有更好的功能集,PostgreSQL也有递归CTE,这对于图形和树工作可能很方便。如果您想坚持使用MySQL,那么从触发器引发异常的“标准”方法是,AFAIK,触发某种非法操作;类似这样的东西可能会很好地工作,但不会太难看:将较小值的id作为用户_id1如何帮助?@lollercoaster:这样可以避免重复。无向意味着
(1,2)
(2,1)
是同一条边,因此如果强制(使用检查)第一个节点的ID低于第二个节点,则不会同时获得
(1,2)
(2,1)
,因为
(2,1)
将违反检查约束。是,很遗憾,检查和约束不适用于MySQL。它们被解析,但在插入/更新时被忽略calls@lollercoaster:您的评论是第一次提到MySQL。你可以用触发器假装它,切换到一个更好的数据库,或者假设你的代码没有插入或更新错误,并抱着最好的希望。@lollercoaster:一个没有名字的“马”和我都倾向于PostgreSQL,它有一个更好的特性集,PostgreSQL也有递归CTE,这对于图形和树工作可能很方便。如果您想坚持使用MySQL,那么从触发器引发异常的“标准”方法是,AFAIK,触发某种非法操作;类似的东西可能工作得很好,但不会太糟糕:我不明白一行的特殊表是用来做什么的…?假设您正在执行一个SELECT查询,其中只需要值1。如果您确实从友谊表中选择了1,那么友谊表中的每一行都会得到1。因此,当您使用SELECT计算值时,您需要一个只有一行的表,这样您最多可以得到一个值的副本。一些RBDM有一个专门的表格用于此目的,但我不知道您使用的是什么RBDM,所以我不知道该如何称呼它。但是你可以创建任何一个只有一行的表并使用它。我不明白有一行的特殊表是用来做什么的…?假设你在做一个SELECT查询,你只需要值1。如果您确实从友谊表中选择了1,那么友谊表中的每一行都会得到1。因此,当您使用SELECT计算值时,您需要一个只有一行的表,这样您最多可以得到一个值的副本。一些RBDM有一个专门的表格用于此目的,但我不知道您使用的是什么RBDM,所以我不知道该如何称呼它。但是您可以创建任何只包含一行的表并使用它,这使您的查询更简单。另外,如果总是在user1中存储最低值,那么就不能有重复项。如果用户14朋友用户18,则存储14,18。但是如果用户18是用户14的朋友,那么你也会存储14,18。UNION ALL可能比UNION更好,数据库的工作量更少,而且不会出现重复。是的,这就是为什么我把你的答案投了高于我的答案的原因。您还提供了实际的检查约束,它使您的查询更简单。另外,如果总是在user1中存储最低值,那么就不能有重复项。如果用户14朋友用户18,则存储14,18。但是如果用户18是用户14的朋友,那么你也会存储14,18。UNION ALL可能比UNION更好,数据库的工作量更少,而且不会出现重复。是的,这就是为什么我把你的答案投了高于我的答案的原因。您还提供了实际的检查约束。有趣!那么,如果我尝试插入一对,比如(13,10),会发生什么呢?有什么方法可以抓住这样的错误吗?另外,如果我理解正确的话,这个唯一的索引是作为表中插入的约束?这是一个有趣的替代检查约束的方法,甚至可以用于MySQL。在这种情况下,添加(13,10)不是一个错误。它只是添加它并为它创建一个索引(10,13)。然后,如果您稍后尝试添加(10,13),它的索引也将为(10,13),因此,它将被拒绝。我应该提到我正在使用MySQL。它抛出一个错误
#1064-您的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,了解在第1行“fb_id1,fb_id2),grest(fb_id1,fb_id2))”附近使用的正确语法。当我尝试使用您提供的唯一索引对解决方案时,
。它不像大多数其他DBMS那样支持函数索引!那么,如果我尝试插入一对,比如(13,10),会发生什么呢?有什么方法可以抓住这样的错误吗?另外,如果我理解正确的话,这个唯一的索引是作为表中插入的约束?这是一个有趣的替代检查约束的方法,甚至可以用于MySQL。在这种情况下,添加(13,10)不是一个错误。它只是添加它并为它创建一个索引(10,13)。然后,如果您稍后尝试添加(10,13),它的索引也将为(10,13),因此,它将被拒绝。我应该提到我正在使用MySQL。它抛出一个错误
#1064-您的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,了解在第1行“fb_id1,fb_id2),grest(fb_id1,fb_id2))”附近使用的正确语法。当我尝试使用您提供的唯一索引对解决方案时,
。它不像大多数其他DBMS那样支持函数索引。
CHECK (user_id1 < user_id2)
select user_id2 from friendship where user_id1 = X
union all
select user_id1 from friendship where user_id2 = X
SELECT user1 FROM friendship WHERE user2 = $user_id
UNION ALL
SELECT user2 FROM friendship WHERE user1 = $user_id
INSERT INTO friendship (user_id1, user_id2) 
SELECT <id1>,<id2> FROM <special table with only one row, contents irrelvant>
WHERE ((<id1>,<id2>) NOT IN
       ((SELECT user_id1, user_id2 FROM friendship)
        UNION 
        (SELECT user_id2, user_id1 FROM friendship)))
 CREATE UNIQUE INDEX unique_pair 
      ON your_table (least(user_id1, user_id2), greatest(user_id1, user_id2));