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

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(使用前将#替换为@)

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

  • 为什么 LOCK TABLES [table] WRITE 不阻止表读取?

    根据http dev mysql com doc refman 5 0 en lock tables html http dev mysql com doc refman 5 0 en lock tables html如果我锁定一张表以在
  • MySQL 错误:列“时间”不能为空

    我收到错误 使用下面的查询时 列 时间 不能为空 第一次没有重复时工作正常 但当尝试再次更新时 我收到错误 列 时间 不能为空 mysql query INSERT INTO table Username Time Videos Credi
  • 如何将两个django模型(表)合并为一个模型(表)

    我想合并两个 django 模型并创建单个模型 我们假设 我有第一个表表 A 其中包含一些列和数据 Table A col1 col2 col3 col4 x1 x2 x3 x4 y1 y2 y3 y4 我还有另一个表 Table B 其中
  • 使用 Hibernate 在 MySQL 中存储字节数组

    我正在尝试保存带有字节数组字段的实体 我在 MySQL 数据库之上使用 Hibernate 和 JPA 这是字段定义 对于嵌入式 H2 数据库来说效果很好 Entity name blob public class Blob Lob Bas
  • MySQL 导入 125000 行 CSV 的最快方法?

    这是我第一次使用 MySQL 除了对现有数据库进行一些基本查询之外 所以我不擅长解决这个问题 我有一个包含 125 000 条记录的 CSV 我想将其加载到 MySQL 中 我安装了版本 8 和工作台 我使用导入向导加载 CSV 它开始导入
  • 通过我的java代码导出数据库

    我想使用我的 java 代码导出我的 MySQL 数据库 但我还没有找到任何办法 我想要做的就是我的应用程序中有一个按钮作为 导出数据库 单击该按钮时 我的数据库应导出到指定的路径 我使用了以下代码 但它不起作用 Runtime runti
  • 使用mysql在一个查询中选择多个表中的子项总数

    我整个下午都在尝试处理一个查询 或两个或三个 以获得三个表的所有子表的计数 看看我的设计 用户表 id user name 1 foo 2 bar 赢表 id won user 1 1 2 1 3 2 绘制表格 id draw user 1
  • MySQL用户创建的临时表已满

    我使用内存引擎创建了一个临时表 如下所示 CREATE TEMPORARY TABLE IF NOT EXISTS some text id INT DEFAULT 0 string varchar 400 DEFAULT engine m
  • 如何使PHP中的激活链接过期?

    我有一个 php 脚本 它通过电子邮件向用户发送激活链接 以便他们可以激活他们的帐户 链接是这样的 mysite com activation phpid id 20 如何创建 24 小时后过期的链接 我还没有尝试过任何东西 因为我找不到任
  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • Preg_replace() 删除除查询结尾之外的所有内容

    首先 为我糟糕的英语感到抱歉 我有这样的疑问 SELECT t1 SELECT COUNT FROM table a t2 WHERE t1 id t2 id c AND t2 status 1 AS aula FROM table c t
  • 通过货币换算获取每种产品类型的最低价格

    我想选择每种产品类型中最便宜的 包括运费 价格转换为当地货币 最便宜 产品 价格 产品 运费 seller to aud 我的数据库有如下表 PRODUCTS SELLERS id type id seller id price shipp
  • 在docker中使用MySQL数据库设置aspnetcore

    我正在尝试设置一个 docker compose 文件 其中包含 asp net core mysql 数据库和 phpmyadmin 的容器 设置我的 mysql 服务器没有问题 我可以使用 phpmyadmin 访问它 我的 asp n
  • MySQL 服务器未启动

    当我做 mysql u root p并输入my password这就是我得到的 错误 2002 HY000 无法通过套接字 var run mysqld mysqld sock 连接到本地 MySQL 服务器 2 所以我输入 systemc
  • 单行的总和值?

    我有一个 MySQL 查询 它返回由一系列 1 和 0 组成的单行 它用于进度条指示器 我现在在代码中对它进行求和 但我尝试对查询中的值求和 并意识到我无法使用 SUM 因为它们有很多列 但只有一行 有没有办法可以在查询中自动求和 就像这样
  • MySQL 存储过程将值分配给 select 语句中的多个变量

    这是我的存储过程 我在为声明的变量赋值时遇到问题 当我执行它时 插入和更新命令工作正常 但声明变量的值保持为 0 但我在数据库中有一些价值 我怎样才能正确地做到这一点 BEGIN DECLARE PaidFee INT DEFAULT 0
  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • 如何使用 MySQL 的 LOAD DATA LOCAL INFILE 在导入 CSV 时将字符串日期更改为 MySQL 日期格式

    我正在使用 MySQL 的 LOAD DATA LOCAL INFILE SQL 语句将数据从 CSV 文件加载到现有数据库表中 下面是一个 SQL 语句示例 LOAD DATA LOCAL INFILE file csv INTO TAB
  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w

随机推荐

  • 单元测试期间 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 个字段 但实际上只有