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

时间:2018-01-01 08:49:14

标签: mysql sql-update

我有一个动态生成的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表来保存数据,然后再更新主表。

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

您可以按以下方式运行这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
}

答案 2 :(得分:0)

您可以使用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)