检查在 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'
也不会以您预期的方式工作。我认为id
是primary 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 查询中修改了哪些列的主要内容,如果未能解决你的问题,请参考以下文章