MySQL使用One Update Statement更新多个记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL使用One Update Statement更新多个记录相关的知识,希望对你有一定的参考价值。

我有一个动态生成的UPDATE语句,如下所示:

UPDATE `maildespatch` SET `RL_TktNumber`= Null ,`SxRemote_IP`= '::1' ,`SxRemotename`= 'Raks' WHERE `Table_ID` = 1 , 
UPDATE `maildespatch` SET `RL_TktNumber`= Null ,`SxRemote_IP`= '::1' ,`SxRemotename`= 'Raks' WHERE `Table_ID` = 2 , 
UPDATE `maildespatch` SET `RL_TktNumber`= Null ,`SxRemote_IP`= '::1' ,`SxRemotename`= 'Raks' WHERE `Table_ID` = 5 , 
UPDATE `maildespatch` SET `RL_TktNumber`= Null,`SxRemote_IP`= '::1' ,`SxRemotename`= 'Raks' WHERE `Table_ID` = '68'

数据来自html表字段上的用户输入,基于此字段通过ajax()调用动态生成这些语句。有没有办法保存所有这些数据以更一般地保存/更新mysql?我不想创建临时MySQL表来保存数据,然后更新主表。

答案

更通用的方法是在mysql中调用存储过程(a.k.a用户定义函数 - UDF)并传递必要的参数。

存储过程是数据库中可重用的代码段(类似于后端代码中的函数),可以封装一段逻辑。查看存储过程here的MYSQL文档。

使用它们,您可以像您想要的那样通用 - 例如,对于最常传递的值(例如SxRemote_IP = '::1' ,SxRemotename = 'Raks')具有默认值,因此您不必通过网络发送它们并在前端代码中省略它们。

另一答案

您可以像下面一样运行这4个查询:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

    $sql = "UPDATE `maildespatch` SET `RL_TktNumber`= '11',`SxRemote_IP`= '::1' ,`SxRemotename`= 'Raks'  WHERE `Table_ID` = '1'; 
            UPDATE `maildespatch` SET `RL_TktNumber`= 'Null',`SxRemote_IP`= '::1' ,`SxRemotename`= 'Raks'  WHERE `Table_ID` = '2'; 
            UPDATE `maildespatch` SET `RL_TktNumber`= '33',`SxRemote_IP`= '::1' ,`SxRemotename`= 'Raks'  WHERE `Table_ID` = '5';
            UPDATE `maildespatch` SET `RL_TktNumber`= 'Null',`SxRemote_IP`= '::1' ,`SxRemotename`= 'Raks'  WHERE `Table_ID` = '68'";

if ($conn->query($sql) === TRUE) {
    echo "Record updated successfully";
} else {
    echo "Error updating record: " . $conn->error;
}

$conn->close();
?>

或者如果要将数据作为数组传递,则可以执行循环:

foreach ($alldata as $data)
{
    //your queries will go here
}
另一答案

你可以使用CASE表达式:

UPDATE maildespatch
SET RL_TktNumber = CASE WHEN Table_ID = '1' THEN '11'
                        WHEN Table_ID = '2' THEN NULL
                        WHEN Table_ID = '5' THEN '33'
                        WHEN Table_ID = '68' THEN NULL END,
    SxRemote_IP = '::1',
    SxRemotename = 'Raks'
WHERE
    Table_ID = IN('1', '2', '5', '68');

请注意,如果Table_ID是一个整数列,那么你应该正确地比较整数,例如: WHERE子句应如下所示:

WHERE Table_ID = IN(1, 2, 5, 68)

以上是关于MySQL使用One Update Statement更新多个记录的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 之 SELECT FOR UPDATE

Update_one 或 insert_many 更新 mongodb 中的记录?

在pymongo的update_one()中出现重复键错误

MySQL的SELECT.FOR UPDATE究竟起啥作用

sp_change_users_login 'Update_One', '用户名', '登录名';

在 Django 的 ORM 中使用带有 UPDATE 的子查询