0

我有一个计算两个用户之间相似度的表;例如

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) 相同。

4

2 回答 2

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) 不可能将 anUPDATE变成INSERT,反之亦然,因为:

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

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

于 2013-08-13T12:57:27.147 回答
0

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

于 2013-08-13T12:41:42.167 回答