检查在 UPDATE 查询中修改了哪些列

Posted

技术标签:

【中文标题】检查在 UPDATE 查询中修改了哪些列【英文标题】:Check which columns were modified in an UPDATE query 【发布时间】:2019-02-07 01:11:17 【问题描述】:

当我们使用 php 更新 mysql 记录时,我们可以使用以下命令检查它是否生效:

$mysqli->affected_rows;

但是如何检查哪一列被修改了呢?

例如,在我的表中有以下列:id / name / age

在记录中,我们有数据:1 / Woton / 18

如果我发送:UPDATE mytable SET name = 'Woton', age = '20' WHERE id = '1'

只有 age 字段发生了变化。我如何确定这一点?

【问题讨论】:

没有内置功能来报告哪些列发生了变化。我们可以检查当前值并与触发器中新分配的值进行比较,但是我们需要某种机制来将该信息从触发器传递到调用者。这也不是内置功能,因此我们需要决定是使用用户定义的变量还是其他表。由于 UPDATE 语句会影响多行,因此我们需要决定如何报告多行的结果。 另外,SET id = '1',WHERE id = '1' 也不会以您预期的方式工作。我认为idprimary auto-incremented key 这个触发器,会是什么样子?我会在正确的数据库中配置它,但是如何让它响应 php 命令呢?这是重点 @WotonSampaio 您正在使用 PHP。只需选择更新前后的行并比较值即可。 @WotonSampaio 只需要 MySQL,请参阅上面斯宾塞的评论,这也让我难以理解。一个额外的查询真的没什么大不了的,除非您在单独的查询中更新数百行。但这里有另一个想法。重新评估是否有必要。有人更新了他们的信息,只需说“您的信息已成功更新”并留下它。无需说他们更新了什么。无论如何,他们应该已经知道了。也不要存储他们的“年龄”,存储他们的“出生日期”。 【参考方案1】:

您不能直接从查询结果中获取更新的列。

它可以从一些 php 查询中得到。首先,我们必须从数据库中选择要在数组变量中更新的行。比对同一行运行更新查询。

最后从新数组变量中的选择查询中从数据库中获取同一行。

最后我们得到两个数组。

我们可以使用 array_diff_assoc php 函数获取更新的列。

请参见下面的代码。

$sql = "SELECT *  from mytable where id=1 limit 1";
$prev = mysqli_fetch_assoc(mysqli_query($conn, $sql));

//Get the column data in the array. Before update.

$sql = "UPDATE mytable SET name = 'Woton', age = '20' WHERE id = '1'";
$conn->query($sql);

// Update data 

$sql = "SELECT *  from mytable where id=1 limit 1";
$updated = mysqli_fetch_assoc(mysqli_query($conn, $sql));

// Again run the select command to get updated data.

$UpdatedColumns=array_diff_assoc($updated,$prev);

【讨论】:

第三个查询不是必须的,我可以使用 $_POST 本身,但这是正确的,这是唯一的解决方案【参考方案2】:

另外说明:如果已在数据库中启用 QueryLog,那么您(或您的 PHP 或 Python 或任何脚本)可以轻松查看/读取内容的哪一部分已更新,甚至您可以监控数据库。

好消息是,即使您可以定位哪个表、哪个查询等。

【讨论】:

以上是关于检查在 UPDATE 查询中修改了哪些列的主要内容,如果未能解决你的问题,请参考以下文章

修改查询以根据特定列检查组内的多个值

Oracle 学习第四篇

Day04- -e Oracle

oracle Update语句卡死,详细情况见下文

在 oracle 中修改列 - 如何在设置为可为空之前检查列是不是可为空?

如何在触发器中检查 where 子句中给出的内容?