INSERT ON DUPLICATE UPDATE .. WHERE foreign_key_id = foreign_key_id

时间:2017-10-30 15:49:06

标签: php mysql

我在函数

中有这个(伪)代码
if(!$foo->id){

    $foo = INSERT INTO foos (....) VALUES (.....)
    $foo->id = new_inserted_id();


    INSERT INTO my_table (foo_id, field1, field2, field3) 
    VALUES ($foo->id, 'aaaa', 'bbbb', 'cccc');

} else {
    // UPDATE $foo and existing record in my_table
    $foo = UPDATE foos SET ..... WHERE id = $foo->id;

    // first check if already exist record having foo-id - this is basically for old records
    $q = SELECT COUNT(id) AS count 
         FROM my_table
         WHERE foo_id = $foo->id
         LIMIT1

    if($q->count > 0){

       // update
       UPDATE my_table SET field1 = 'aaaa', field2 = 'bbbb', field3 = 'cccc'
       WHERE foo_id = $foo->id
       LIMIT 1;

    } else {

       INSERT INTO my_table (foo_id, field1, field2, field3) 
       VALUES ($foo->id, 'aaaa', 'bbbb', 'cccc');

    }

}

我想专注于UPDATE部分(第一部分)。而不是选择并检查是否是新的插入或更新,我可以执行INSERT ON DUPLICATE UPDATE但是还有WHERE语句吗?像这样:

INSERT ON DUPLICATE UPDATE ... WHERE WHERE foo_id = $foo->id

1 个答案:

答案 0 :(得分:1)

使用ON DUPLICATE KEY UPDATE时,不能使用普通的where子句,mysql不允许。您可以使用条件语句作为变通方法。

这样的事情可能就是你想要的。

$q = "INSERT INTO my_table (foo_id, field1, field2, field3)
($foo->id, 'aaaa', 'bbbb', 'cccc')
ON DUPLICATE KEY UPDATE SET
field1 = IF( foo_id = VALUES(foo_id), VALUES('aaaaa'), 'bbbb' ),
field2 = VALUES('bbbbb'),
field3 = VALUES('cccc')";