MySQL的独特组合列

时间:2013-08-13 12:00:28

标签: mysql sql combinations

我有一个表来计算两个用户之间的相似性; e.g。

user1   user2    similarity
  1       3          0.7
  2       1          0.9
 ...     ...         ...
 ...     ...         ...
 ...     ...         ...

我需要的是对表进行建模,以便在您拥有上述模型后,插入以下内容:

replace into table values(3,1,0.4)

实际上会更新第一行。这种情况有标准做法吗?也就是说,user1和user2的组合必须是唯一的,例如:(3,1)应该被认为与(1,3)相同。

2 个答案:

答案 0 :(得分:1)

我相信你必须采用这样的存储过程:

CREATE PROCEDURE InsertOrUpdateSimilarity (
    pu1 INT, pu2 INT, ps FLOAT -- user1, user2, similarity
)
BEGIN
    -- try to update either (pu1, pu2) or (pu2, pu1)
    UPDATE similarities SET similarity = ps
    WHERE (user1 = pu1 AND user2 = pu2) OR (user1 = pu2 AND user2 = pu1) ;

    IF ROW_COUNT() = 0
    THEN -- no row has been updated, record must be created
        INSERT INTO similarities VALUE (pu1, pu2, ps) ;
    END IF ;
END ;

@ Vatev的解决方案乍一看似乎很有吸引力,但我不认为用触发器实现所需的行为是可能的。这是因为

1)无法将UPDATE变为INSERT,反之亦然,since

  

[触发器] 不允许通过调用函数或触发器的语句修改已经使用(用于读取或写入)的表

2)UPDATE触发器只能访问当前正在修改的行

答案 1 :(得分:0)

您可以在表上编写一个触发器,用于检查表中user1和user2的任意组合,如果存在任何组合,则会更新相应的行。