SQL IF EXIST UPDATE ELSE INSERT准备好的语句

时间:2016-06-06 22:18:58

标签: mysql prepared-statement

我打破了我的大脑,我真的会帮助你!

这是我到目前为止的代码..

$conn = db_connect();                       
$sql = "INSERT INTO measurements
(`date`, `weight`, `waist`, `id`) VALUES (?,?,?,?)";
$stmt = $conn-> prepare($sql); 
$stmt ->bind_param("sddi", $date, $_POST['weight'], $_POST['waist'], $user_id);
$stmt->execute();
$stmt->close();
$conn->close();

它是一个用于sql插入的预准备语句。现在我想将它更改为IF EXIST THEN UPDATE ELSE插入我现在正在做的方式。这样的事情,但随后准备好了声明:

IF EXISTS 
(SELECT * FROM measurements WHERE user_id=’4’)
UPDATE measurements SET (`weight`=40, `waist`=45) WHERE user_id=’4’
ELSE
INSERT INTO measurements 
VALUES (`date`='week 1', `weight`= 40, `waist`=45, `id`=4)

我在stackoverflow上发现了一些关于if EXIST然后更新else插入的文章,但我没有找到它,其中有一个准备好的语句对我有用。

万分感谢!

更新:

我已将其改为主题式。

$sql = "
INSERT INTO measurements (uniqueID, date, weight, waist) 
VALUES ('$uniqueID', '$date', '$weight',  '$waist') 
ON DUPLICATE KEY UPDATE weight= '$weight', waist= '$waist'";

$conn->query($sql);

现在问题的第二部分,我如何将其作为准备好的陈述?

2 个答案:

答案 0 :(得分:1)

实施琼斯先生'作为mysqli预处理语句的解决方案,您可以这样编写它:

$sql = "INSERT INTO measurements
            (`uniqueID`, `date`, weight, waist) 
          VALUES
            (?, ?, ?, ?) 
          ON DUPLICATE KEY
            UPDATE weight = ?, waist = ?";
$stmt = $conn->prepare($sql); 
$stmt ->bind_param("isdddd", $user_id, $date, $_POST['weight'], $_POST['waist'], $_POST['weight'], $_POST['waist']);
$stmt->execute();

稍微清洁的实现方法是使用PDO

$sql = "INSERT INTO measurements
            (`uniqueID`, `date`, weight, waist) 
          VALUES
            (:uniqueId, :date, :weight, :waist) 
          ON DUPLICATE KEY
            UPDATE weight = :weight, waist = :waist";
/* $conn is a PDO object */
$stmt = $conn->prepare($sql);
$stmt->execute(array(':uniqueId' => $user_id, ':date' => $date, ':weight' => $_POST['weight'], ':waist' => $_POST['waist']));

请注意,对于命名占位符,您可以在多个位置使用相同的名称,只需要赋值一次。

答案 1 :(得分:0)

MySQL的方法是INSERT ... ON DUPLICATE KEY UPDATE ...。效果很好;特别是如果多个数据库连接尝试命中同一行,它会避免竞争条件。

这要求UPSERT的目标表具有有意义的唯一索引或主键。您的id似乎就是那个密钥。

您绝对可以使用参数绑定向其显示数据。

你可以在这里阅读。 http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html