我已经看到了一些有关此问题的摘要,但是没有一个能完全回答问题。我已经拼凑了一个最初不抱怨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,因此我们不替换现有值,而是将其添加。
答案 0 :(得分:1)
正如@TimBiegeleisen所说,如果您在StartedTransition
和field_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