【问题标题】:MYSQL insert or update if exists on a one-way composite primary key table如果存在于单向复合主键表上,则 MYSQL 插入或更新
【发布时间】: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 1user 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,那么您需要决定是否可以使用INSERTUPDATE,如果您希望在服务器端完成多个操作,可能会需要stored procedure

标签: php mysql insert insert-update


【解决方案1】:

根据您的描述,您似乎只保持“最新”的关系。如果是这种情况,为什么不先删除关系,然后插入新关系?

【讨论】:

  • 我太固执了,没有意识到我可以做到这一点,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2011-05-11
相关资源
最近更新 更多