我有一个表来计算两个用户之间的相似性; 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)相同。
答案 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的任意组合,如果存在任何组合,则会更新相应的行。