MySQL多重插入查询Where Not Exists

4

更新并感谢 @ypercube 的答案和贡献。

以下是答案,我已经自行发布,并按照我的PHP助手将其编写成了PDO格式。

    INSERT INTO `users_relationship` (`profile_1_id`, `profile_2_id` ,`request_date`,`auth_token`,`status`, `updated`, `deleted`)
    VALUES
        (:uid, :fid, '$now', '$fToken', 0, '$now',0),
        (:fid, :uid, '$now', '$fToken', 0, '$now',0)
    ON DUPLICATE KEY UPDATE request_date = VALUES(request_date), auth_token = VALUES(auth_token), updated = VALUES(updated), deleted = VALUES (deleted);

我有一个MySQL查询让我感到困惑,要求我同时在表中创建两行数据,但这些行可能已经存在,因此我需要更新这些行中的某些列而不是插入重复项。

例如:

Justin(2)与Ben(5)有关联,然后通过更新数据库中profile_1_id为2或5的行并将标志插入删除列来终止关系。然后Ben试图重新点燃关系,因此我们需要再次更新这些行并删除删除标志,并使用新值更新请求日期、授权令牌和更新时间戳。

我编写了以下代码,但出现错误:

重复的列名'2012-09-05 10:13:06'

INSERT INTO `users_relationship` (`profile_1_id`, `profile_2_id`,`request_date`,`auth_token`,`status`, `updated`, `deleted`)
    SELECT * FROM 
        (SELECT 2, 5, '2012-09-05 10:13:06', 'SQLTEST', 0, '2012-09-05 10:13:06', 0) AS faTmp,
        (SELECT 5, 2, '2012-09-05 10:13:06', 'SQLTEST', 0, '2012-09-05 10:13:06', 0) AS fTmp
    WHERE NOT EXISTS 
        (SELECT  * FROM `users_relationship`WHERE `profile_1_id`=2 AND `profile_2_id` =5) OR 
        (SELECT  * FROM `users_relationship`WHERE `profile_1_id`=5 AND `profile_2_id` =2) LIMIT 1

我现在的做法是否正确,或者有更好的方法可以实现吗?

谢谢。

贾斯汀

2个回答

6
最佳方式似乎是在(profile_1_id,profile_2_id)上添加一个UNIQUE约束,然后使用以下方法:
INSERT INTO `users_relationship` 
  (`profile_1_id`, `profile_2_id`
  ,`request_date`,`auth_token`,`status`, `updated`, `deleted`)
VALUES
  (2, 5, '2012-09-05 10:13:06', 'SQLTEST', 0, '2012-09-05 10:13:06', 0),
  (5, 2, '2012-09-05 10:13:06', 'SQLTEST', 0, '2012-09-05 10:13:06', 0) 
ON DUPLICATE KEY UPDATE
  request_date = VALUES(request_date)          --- what you want to happen
, auth_token = VALUES(auth_token)              --- when rows exist
  --- ; 

这是有序的吗?例如:(2,5)和(5,2)是否相同? - podiluska
@podiluska:不,对(profile1, profile2)设置唯一键将允许(2,5)(5,2) - ypercubeᵀᴹ
在该部分中,每个重复的行将被单独处理。如果您指的是列,则是逗号分隔的。 - ypercubeᵀᴹ
在重复键更新request_date为VALUES('2012-09-05 10:13:06'),auth_token为VALUES('SQLTEST'),updated为VALUES('2012-09-05 10:13:06'),deleted为VALUES(0); - Justin Erswell
@justin:不要在那里放置值。按照我回答中的语句使用它。 - ypercubeᵀᴹ
显示剩余3条评论

1

你可以这样做,但是语法是这样的

 WHERE NOT EXISTS  
        (SELECT  * FROM `users_relationship`WHERE `profile_1_id`=2 AND `profile_2_id` =5) 
 AND  
 NOT EXISTS  
        (SELECT  * FROM `users_relationship`WHERE `profile_1_id`=5 AND `profile_2_id` =2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接