MySQL IF存在更新其他插入内容-完整的SQL示例(不可重复)

时间:2018-08-09 04:40:54

标签: mysql exists insert-update

我已经看到了一些有关此问题的摘要,但是没有一个能完全回答问题。我已经拼凑了一个最初不抱怨phpMyAdmin的版本,但是当我执行时,它抱怨...

SELECT IF( EXISTS(
  SELECT 1 FROM opts
  WHERE field_from_tbl1=47 AND field_from_tbl2=153) THEN
                  UPDATE tbl3
                  SET acct_id='update@us.com', 
                  id_type='email',
                  status='valid',
                  change_log=CONCAT(change_log, '|this_change_log_update|'),
                  bool1=false,
                  bool2=true
                  WHERE field_from_tbl1=47 AND field_from_tbl2=153
  ELSE
          INSERT INTO tbl3 (field_from_tbl1, field_from_tbl2, acct_id, id_type, status, change_log, bool1, bool2)
          VALUES (47, 153, 'insert@us.com', 'email', 'valid', '|this_change_log_update|', false, true)

一些注意事项:来自其他两个表的字段值不能单独为UNIQUE。使其在组合中都被迫具有唯一性的地方可能还可以,但我一直无法弄清楚。因此,我正在假设一个局限性,即数据库将不会强制它们唯一,因此我认为删除了使用REPLACE的选择。另外,您可能会注意到IF语句中缺少“)”。当我尝试添加它时,该死的东西抱怨。这里的一则帖子建议在第3行的THEN之前添加“,1,0)”,但也会出错。最后,您可能会注意到我在change_log字段上使用了CONCAT,因此我们不替换现有值,而是将其添加。

1 个答案:

答案 0 :(得分:1)

正如@TimBiegeleisen所说,如果您在StartedTransitionfield_from_tbl1上有一个索引(主索引或唯一索引),则可以使用INSERT ... ON DUPLICATE KEY UPDATE来执行此操作。这应该起作用:

field_from_tbl2

INSERT INTO tbl3 (field_from_tbl1, field_from_tbl2, acct_id, id_type, status, change_log, bool1, bool2) VALUES (47, 153, 'insert@us.com', 'email', 'valid', '|this_change_log_update|', false, true) ON DUPLICATE KEY UPDATE SET acct_id='update@us.com', id_type=VALUES(id_type), status=VALUES(status), change_log=CONCAT(change_log, VALUES(change_log)), bool1=VALUES(bool1), bool2=VALUES(bool2) 函数将匹配值从语句的VALUES部分复制到INSERT

如有必要,您可以使用UPDATE添加适当的索引:

ALTER TABLE