php - MYSQL insert or update if exists on one-way composite primary key table 单向复合主键表

标签 php mysql insert insert-update

我有一个用户之间的友谊表,如下所示。

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 是指向另一个表的指针,该表定义了用户之间的关系类型(friendship(1)、pending(2) 或 blocked(3))

如果 user 1user 2 的 friend ,我只有一个实例 |1|2|1|也不是 |2|1|1|

问题是,为了阻止用户,我必须记住关系可能已经建立(用户可能已经是 friend ,甚至有待处理的友谊申请)所以我试图插入数据或更新它如果该关系尚不存在。

我有这个用于发送友谊请求,但如果数据已经存在,这只会忽略插入。

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 专家,尽管到目前为止我已经掌握了自己的知识。 希望我已经很好地解释了自己。

感谢您的反馈。

最佳答案

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

关于php - MYSQL insert or update if exists on one-way composite primary key table 单向复合主键表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16923661/

相关文章:

php - 使用 CodeIgniter 进行用户身份验证

php - 基于下拉菜单选择的 SQL 查询

php - 如何在单个查询中运行多个查询

PHP:抽象类的用例是什么

PHP MySql PDO 多重插入不起作用

php - INSERT 查询根本不添加

mysql - Rails 从表列中随机选择

php - 试图从 PHP 函数中执行 SQL 查询

mysql - 根据日期获取记录(最近30天)

mysql - SQL : Insert doesn't work