MySQL多重插入查询不存在的地方

时间:2012-09-05 10:02:54

标签: mysql sql entity-relationship

更新&回答@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然后尝试重新启动关系,因此我们需要再次更新行并删除已删除的标志并更新request_date,auth_token&用新值更新。

我写了以下内容,但它没有触发错误:

  

重复列名称' 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 个答案:

答案 0 :(得分:6)

最好的方法似乎是在UNIQUE上添加(profile_1_id, profile_2_id)约束,然后使用:

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
  --- ; 

答案 1 :(得分:0)

你可以这样做,但语法是

 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)