AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 12669
Accepted
blunders
blunders
Asked: 2012-02-11 17:48:52 +0800 CST2012-02-11 17:48:52 +0800 CST 2012-02-11 17:48:52 +0800 CST

查找和更新少量记录的最佳实践?

  • 772

似乎是一个简单的问题,但想知道如果您“点缀您的 i 并交叉您的 t”,那么执行此操作的“最佳”方法是什么。

best-practices select
  • 1 1 个回答
  • 4237 Views

1 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2012-02-12T06:27:51+08:002012-02-12T06:27:51+08:00

    没有更多细节,这就是我所能提供的:

    不要使用视觉设计师。 您可能很想在 Management Studio 中使用“编辑前 200 行”(以前称为“打开表”)来“编辑”数据,例如电子表格。抵制诱惑。这些设计者充满了错误,在表上持有不必要的锁,任意选择 200 行,直到您修改 SQL 查询并不得不再次运行它,并且只是有彻头彻尾的意外行为。(例如,您是否知道要输入1或0输入一BIT列,您必须输入True或False?在 SQL Server 2012 版本的 Management Studio 之前输入1或0产生错误。)使用查询窗口并编写UPDATE带有WHERE子句的正确语句 -除了具有 DML 的全部功能(包括UPDATE基于连接,您不能与设计器一起做),您还可以保存查询,将它们放入源代码管理等。您可以在表格网格中完成的工作的唯一方法是拍摄视频你做了什么。

    验证你的工作。我通常有这样的事情:

    UPDATE t
        SET x = REPLACE(x, 'foo', 'bar'),
        y = x + ' line 2'
    FROM dbo.table AS t
    WHERE ID = 1;
    

    这样可以很容易地注释掉前两行并添加SELECT,以便我可以检查输出。所以在我运行更新之前,我可以这样检查:

    --UPDATE t
        --SET
    SELECT 
        x = REPLACE(x, 'foo', 'bar'),
        y = x + ' line 2'
    FROM dbo.table AS t
    WHERE ID = 1;
    

    这向我展示了两件事:(1)我的SET命令是否以正确的方式更改了列数据,以及(2)我的WHERE子句是否选择了正确的行和正确的行数。

    保护自己免受肥胖指法。当我对关键数据执行临时更新时,我总是开始查询,BEGIN TRANSACTION;然后在下面有一个注释--ROLLBACK TRANSACTION;和语句,只有当我对受影响的正确行数感到满意时,我才会--COMMIT TRANSACTION;突出显示并运行该命令。在 SO 问题中,该人建议您应该运行一次,然后再运行一次 - 我认为这一步太多了,特别是如果操作需要很长时间,持有很多锁等。您应该能够验证在不执行操作的情况下是否工作,将其回滚,然后重新执行整个操作。对我来说COMMITUPDATEROLLBACKROLLBACK如果我在错误的时间按 F5,是否只突出显示了部分查询,等等。这样的事情:

    BEGIN TRANSACTION;
    
    /* query goes here */
    
    -- COMMIT TRANSACTION;
    -- ROLLBACK TRANSACTION;
    

    实际上,我使用 Mladen Prajdic 的SSMS 工具包和新查询的自定义模板,这样我就可以一直使用它。是的,当我只想对非生产实例运行一个快速的临时查询时,这很烦人,但是只需 Ctrl+A 就可以很容易地覆盖它。它还有其他一些简洁的功能,而且它是免费的,所以无论如何都值得一试。

    研究表。您可能认为您只更新了一行或几行,但可能还有其他您不知道的副作用。触发器、索引视图等。根据您更新的行数,您可能会觉得需要手动更新统计信息(特别是如果您对过滤索引的结果进行了重大更改,这是最近出现的)。

    保护自己不被解雇。我们都会犯错误,即使遵循这些规则,您仍然可能会因临时更新生产数据而导致意想不到的后果。因此,在执行此类操作时,请始终做两件事:

    1. 在执行更新之前备份数据。当您无法控制谁在更新数据(或备份计划/链)时,我见过的一个技巧是延迟使用日志传送。因此,您无需立即恢复副本上的日志,而是等待 8 小时。这样一来,如果有人在白天对数据进行了愚蠢的更新,那么至少会有一些不太旧的数据边缘副本,您可以毫不费力地取回受影响的行。在一家商店,我们称其为“再次向自己的脚开枪,嗯?” 保险政策。由于一次错误更新而不得不对整个数据库执行时间点恢复,这在大型系统中可能是相当灾难性的。
    2. 保持你的简历是最新的。如果您经营的UPDATE公司会削弱客户或破坏您的业务或给人们带来大量过度工作和压力,那么他们可能会开始寻找堕落的人。不要做一个堕落的家伙。
    • 9

相关问题

  • 具有用户、角色和权限的数据库模型

  • 识别孤立数据的最佳方式?

  • 如何管理我自己的脚本

  • Oracle 数据库的推荐 RAID 配置是什么?

  • 连接不同地理区域的数据库的最佳实践

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve