我在提及this post。我遇到了一个我无法解决的问题。我尝试用php脚本将多行插入MySQL数据库。我没有成功使用ON DUPLICATE KEY UPDATE和使用WHERE条件更新整个事情(在下面的代码末尾)我想用来更新最近修改过的条目:
// for information (used in a foreach loop):
$args[] = '("'.$row['lastname'].'", '.$row['phone'].', "'.$row['lastModification'].'")';
// then:
$stringImplode = implode(',', $args);
// Where I am stuck - WHERE statement:
$sql = $mysqli->query('INSERT INTO table_name '. (lastname, phone, timestamp) .' VALUES '.$stringImplode .'ON DUPLICATE KEY UPDATE lastname=VALUES(lastname), phone=VALUES(phone) WHERE timestamp > VALUES(lastModification);
一切正常,但我不能在此时设置任何包含多个条目的WHERE条件。在这种情况下,WHERE语句可能不是指本声明中的条件。
我被告知使用JOIN语句和临时表尝试使用数据库过程,首先包含所有条目,然后查询某些条件。但我必须承认,我不太了解如何利用这样的表来更新另一张表。
在这种情况下,使用 "CASE WHEN"
或 "IF" statement
是否有一种简单可爱的方法?
会像
INSERT INTO ... ON KEY DUPLICATE UPDATE lastname = VALUES(lastname), phone = VALUES(phone)
CASE WHEN (timestamp > VALUES(lastModification)) THEN do nothing ...
或
...ON KEY DUPLICATE UPDATE... IF (timestamp > VALUES(lastModification)) ...
如果有人能帮助我,我将非常感激。
编辑:由于我会有很多变量,可以这样使用:
INSERT INTO ... ON KEY DUPLICATE UPDATE
IF(timestamp > VALUES(timestamp),
(
name = VALUES(name),
number = VALUES(number),
timestamp = VALUES(timestamp)
....many other variables
),
(
name = name,
number = number,
timestamp = timestamp
....many other variables)
)
答案 0 :(得分:2)
您可以在值中使用简单的IF函数:
INSERT INTO ... ON KEY DUPLICATE UPDATE
name = VALUES(name),
number = VALUES(number),
timestamp = IF(timestamp > VALUES(timestamp), VALUES(timestamp), timestamp)
如果不满足条件,它将使用已存在的相同时间戳更新时间戳。没关系,因为在执行之前对相同值的更新进行了优化,因此MySQL不会进行真正的更新。你不应该害怕一些性能损失。
修改强> IF作品喜欢这样:
IF(condition, returned when true, returned when false)
也许您需要切换这两个参数以满足您的条件。