完整sql示例(不是重复的)

nnt7mjpx  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(268)

我已经看到了一些关于这个问题的片段,但是没有一个能够完全回答这个问题。我拼凑了一个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)

注意:另外两个表中的字段值不能单独唯一。在一个组合中,两者都必须是唯一的,这也许是可以的,但我还没有弄清楚。因此,我正在研究假设限制,即db不会强制这些是唯一的,我认为这会删除我使用replace的选项。另外,您可能注意到if语句中缺少“)”。当我试图添加它时,该死的东西抱怨。这里有一个帖子建议在第3行中的then之前加上“,”1,0“),但也有错误。最后,您可能注意到我在change\u log字段上使用concat,所以我们不替换现有值,而是添加到它。

5hcedyr0

5hcedyr01#

正如@timbiegeleisen所说,如果您在 field_from_tbl1 以及 field_from_tbl2 你可以用一个 INSERT ... ON DUPLICATE KEY UPDATE 执行此操作。这应该起作用:

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 :

ALTER TABLE tbl3 ADD UNIQUE KEY (field_from_tbl1, field_from_tbl2)

相关问题