更新&回答@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
我是在正确的道路上还是有更好的方法来做到这一点?
由于
贾斯汀
答案 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)