只更新更改的字段还是全部字段?

2024-02-28

我想知道在更新记录以检索现有记录、循环遍历字段检查更改并仅将更改的字段放入更新查询中是否值得花费服务器时间? (我正在使用 MySQL 和 PHP。)

这样做的主要原因是为了减少更改日志的更新查询的大小。通常查询可能有 15 个字段,但实际上只有 2 个字段被更改。该查询还可以用于记录日志,因为它只包含更改的字段,因此更容易解析。

我关心的是检索现有记录所需的时间。

或者有没有办法从 MySQL 检索它更新了哪些字段?


我认为值得改变 - 但可能不值得在插入之前进行选择。

我只更新已更改的字段,这是遵循 activerecord 模式的 DbEntity 类操作的一部分。执行此操作几乎不需要额外费用,因为我保存当前记录和原始记录 - 只要加载记录即可复制。

原因很简单——并不是真正的性能。您还可以通过在更新字段的旧值上添加 where 子句来检查并发修改,并抛出相应的错误。

在写入/更新方法中:

$s1 = "";

foreach ($this->record as $key => $value)
{
    // only update fields that have been changed
    if ($value != $this->orig_record[$key])
    {
        $s1 .= $comma."`$key`='".mysql_real_escape_string($value)."'";
        $comma = ", ";
    }
}

$query = "UPDATE ".$this->table." SET $s1 where {$this->id_field}='".$this->get_keyfield()."'";
$query .= $this->extra_sql_update;
mysql_query($query);

$ar = mysql_affected_rows();
//
// the number of affected rows is actually those changed by the update operation, which will 
// either be zero, or 1. If the query affects more than one row then we have a problem.
if ($ar < 0 || $ar > 1)
{
    cbf_error("cbf_dbentity: {$this->table} :: only one row (not $ar) must be affected by an insert operation. $query",
      E_USER_ERROR);
}
else
{
    $new_id = $this->get_keyfield();

    GlobalEventBus::notify_all(new AuditLogSQL($this->table, "update", $query));

}

$this->orig_record = Array();

foreach ($this->record as $key => $value)
    $this->orig_record[$key] = $value;


//
// sanity check - ensure that what we have just written is actually there.

$this->load($new_id);

foreach ($this->orig_record as $key => $value)
    if (trim($this->record[$key]) != trim($value) 
        && (!$this->record[$key] == "0" && $value=""))
        cbf_error("cbf_dbentity: {$this->table} :: record differs during write after reload: field $key was \"$value\", after write it is now \"".
              $this->record[$key]."\"",E_USER_ERROR);

在加载方法中

$this->orig_record = Array();
foreach ($this->record as $key => $value)
    $this->orig_record[$key] = $value;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

只更新更改的字段还是全部字段? 的相关文章

随机推荐

  • 单元测试期间 Ada 中的异常处理

    我正在尝试为我最近编写的一些 Ada 代码编写一些单元测试 我有一个特殊的情况 我希望得到一个异常 如果代码工作正常 我不会 但在这种情况下我所做的只是测试 而不是编写代码 如果我在测试例程中处理异常 那么我不知道如何继续在该过程中进行测试
  • R/shiny + mathjax,不渲染数学

    我的行为很奇怪MathJax and shiny 我已经修改了01 hello示例来自shiny包包括一个 Rmd文件通过includeMarkdown 我修改的只是ui R如下 Show a plot of the generated d
  • 在我的 CentOS 机器上找不到wireshark init.lua

    所以我试图在我的 CentOS 7 服务器上获取一个与 tshark 一起使用的脚本 但我遇到了问题 该脚本在我的Windows笔记本电脑上运行良好 我只是将其放在appdata的plugins文件夹中 但我在linux上找不到类似的位置
  • 如何检索泛型方法的名称,包括泛型类型名称

    In C 我有一个具有以下签名的方法 List
  • 如何设置内容类型标头以响应 Pyramid Web 框架中的特定文件类型

    我正在使用金字塔网络框架来构建一个网站 我不断在 Chrome 控制台中收到此警告 资源解释为字体 但使用 MIME 类型 application octet stream 传输 http static images fonts font
  • Draw.io XML 文件的格式?

    我在 draw io 中创建了一个形状并将其导出以获取其 XML 文件 如下所示
  • 如何将 gRPC 定义的 API 引入 Web 浏览器

    我们想要为我们的 gRPC 微服务构建一个 Javascript HTML gui 由于浏览器端不支持 gRPC 我们想到使用 web sockets 连接到 node js 服务器 该服务器通过 grpc 调用目标服务 我们努力寻找一个优
  • 在 php 中使用 isset() 而不是 @ 是否有任何重要原因

    所以我正在努力清理一个可怕的代码库 并且我正在慢慢转向完整的错误报告 这是一个艰巨的过程 有数百条通知 内容如下 Notice Undefined index incoming in path to code somescript php
  • libgdx 将窗口定位在舞台之外

    我想知道如何使用 MoveToAction 或任何方法 将 scene2d 窗口定位在舞台之外 我希望菜单能够滑入和滑出 我的舞台和皮肤存储在我的世界级中 这些方法目前工作正常 但根本没有动画效果 Window window new Win
  • AVPlayer无法播放

    我想用 AVPlayer 播放远程 mp3 我无法让它工作 我也看不出它不起作用的原因 代码 NSString urlstr some link to a mp3 NSURL url NSURL URLWithString urlstr s
  • GS1-128条码解析

    扫描仪型号 Motorola DS4208 HC 我们需要解析 GS1 128 条形码 我们知道他们将使用 GTIN 01 批号 10 有效期 17 序列号 21 输入字符串 01 07612345678900 17 100503 10 A
  • 如何避免单个像素线在wpf中消失?

    我使用路径element StrokeThickness 1 SnapsToDevicePixels True 在网格中 我想调整窗口大小 Grid 元素被 Viewbox 元素包裹 Problem 当我调整窗口大小时 路径有时会消失 如果
  • 使用导航组件时从子级获取父级片段

    我需要将数据从一个片段传输到另一个片段 现在推荐的方法是使用共享ViewModel 为了在两个片段中获得相同的实例 需要共同的所有者 因为这可能是他们的共同点Activity 但通过这种方法 在单一活动的情况下 ViewModel实例将存在
  • 跨浏览器自定义复选框

    I have HTML and CSS我用来构建自定义复选框的代码 我相信我的代码具有正确的网络工具包 但它似乎不适用于 FireFox 这是代码 HTML
  • Delphi 带有 HTML/CSS 界面

    我想开发一个带有 HTML CSS 图形用户界面的 delphi 应用程序 不一定在 Web 浏览器中运行 我想这样做 创建一个更丰富的带有动画等的图形用户界面 并摆脱正常的 VCL 组件 Windows 外观 有什么建议么 HTML 和
  • 指针数组的大小

    我对 sizeof 运算符有疑问 Code 1 int main int p 10 printf d sizeof p output 40 return 0 Code 2 int main int p 10 printf d sizeof
  • 在 APK 文件中嵌入登录详细信息,每个用户都不同(或其他选项?)

    我们被要求为一家拥有现有网站和现有用户的公司创建一个 Android 瘦 Web 客户端 他们想要向用户发送彩信 为每个用户提供自己的下载 URL 该 URL 将指向专门为该用户创建的 Android apk 文件 它将包含该用户的网站登录
  • jQuery DataTables:控制表宽度

    我在使用 jQuery DataTables 插件控制表格宽度时遇到问题 该表应该是容器宽度的 100 但最终是任意宽度 而不是小于容器宽度 感谢建议 表声明看起来像这样 table class display cellspacing 0
  • 使用 texelFetch() 进行纹理化

    当我将非最大值传递到纹理缓冲区时 在渲染时它会绘制具有最大值颜色的几何图形 我在使用 glTexBuffer API 时发现了这个问题 例如 假设我的纹理数据是GLubyte 当我传递任何小于255的值时 那么颜色与用255绘制的颜色相同
  • 只更新更改的字段还是全部字段?

    我想知道在更新记录以检索现有记录 循环遍历字段检查更改并仅将更改的字段放入更新查询中是否值得花费服务器时间 我正在使用 MySQL 和 PHP 这样做的主要原因是为了减少更改日志的更新查询的大小 通常查询可能有 15 个字段 但实际上只有