【发布时间】:2013-05-31 04:37:59
【问题描述】:
我有一个用户之间的friendship表,如下所示。
CREATE TABLE user_relations (
pkUser1 INTEGER UNSIGNED NOT NULL,
pkUser2 INTEGER UNSIGNED NOT NULL,
pkRelationsType TINYINT UNSIGNED NOT NULL,
PRIMARY KEY(pkUser1,pkUser2),
FOREIGN KEY(pkuser1) references users(ID),
FOREIGN KEY(pkuser2) references users(ID),
FOREIGN KEY(pkRelationsType) references user_relations_type(ID)
);
pkRelationsType 是指向另一个表的指针,该表定义了用户之间的关系类型(友谊(1)、待定(2)或被阻止(3))
如果 user 1 是 user 2 的朋友,我只有一个实例 |1|2|1| 而也没有 |2|1|1|。
问题是,为了阻止用户,我必须牢记关系可能已经建立(用户可能已经是朋友,甚至有待处理的友谊请求)所以我正在尝试插入数据或更新它如果关系不存在。
我有这个用于好友请求发送,但是如果数据已经存在,这只是忽略插入。
INSERT INTO
user_relations(pkUser1,pkUser2,pkRelationsType)
SELECT * FROM (SELECT :sender0,:target0,2) AS tmp
WHERE NOT EXISTS
(SELECT pkUser1 FROM user_relations
WHERE
(pkUser1= :sender1 AND pkUser2=:target1) OR (pkUser1=:sender2 AND pkUser1=:target2) LIMIT 1)
由于表格的性质,我不能使用INSERT ... ON DUPLICATE KEY UPDATE。
我一直在考虑用 PHP 处理它,搜索关系及其顺序(如果存在),然后做一件事或另一件事,但这似乎是浪费处理。
请注意,尽管到目前为止我已经处理过自己,但我并不是 MYSQL 专家。 希望我已经对自己进行了充分的解释。
感谢您的反馈。
【问题讨论】:
-
如果您不能使用
ON DUPLICATE KEY UPDATE,那么您需要决定是否可以使用INSERT或UPDATE,如果您希望在服务器端完成多个操作,可能会需要stored procedure。
标签: php mysql insert insert-update