首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在运行SQL Update语句之前对其进行测试?

如何在运行SQL Update语句之前对其进行测试?
EN

Stack Overflow用户
提问于 2012-06-13 16:55:39
回答 5查看 125.6K关注 0票数 112

在某些情况下,在生产环境中运行UPDATE语句可以节省时间。然而,borked更新可能比最初的问题更糟糕。

除了使用测试数据库之外,还有哪些选项可以在运行update语句之前告诉它它会做什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-06-13 16:59:26

除了像Imad所说的那样使用事务(无论如何都应该是强制性的),您还可以通过使用与UPDATE相同的WHERE子句运行select来检查哪些行受到影响。

所以如果你更新的是

代码语言:javascript
复制
UPDATE foo
  SET bar = 42
WHERE col1 = 1
  AND col2 = 'foobar';

下面将向您显示将更新哪些行:

代码语言:javascript
复制
SELECT *
FROM foo
WHERE col1 = 1
  AND col2 = 'foobar';
票数 63
EN

Stack Overflow用户

发布于 2015-07-16 05:46:47

那么事务处理呢?它们具有回滚功能。

@查看https://dev.mysql.com/doc/refman/5.0/en/commit.html

例如:

代码语言:javascript
复制
START TRANSACTION;
SELECT * FROM nicetable WHERE somthing=1;
UPDATE nicetable SET nicefield='VALUE' WHERE somthing=1;
SELECT * FROM nicetable WHERE somthing=1; #check

COMMIT;
# or if you want to reset changes 
ROLLBACK;

SELECT * FROM nicetable WHERE somthing=1; #should be the old value

回答来自@rickozoe的以下问题:

通常,这些行不会一次执行。在PHP f.e.您可能会这样写(可能会更简洁一些,但希望快速回答;- ):

代码语言:javascript
复制
$MysqlConnection->query('START TRANSACTION;');
$erg = $MysqlConnection->query('UPDATE MyGuests SET lastname='Doe' WHERE id=2;');
if($erg)
    $MysqlConnection->query('COMMIT;');
else
    $MysqlConnection->query('ROLLBACK;');

另一种方法是使用MySQL变量(请参见https://dev.mysql.com/doc/refman/5.7/en/user-variables.html和https://stackoverflow.com/a/18499823/1416909 ):

代码语言:javascript
复制
# do some stuff that should be conditionally rollbacked later on

SET @v1 := UPDATE MyGuests SET lastname='Doe' WHERE id=2;
IF(v1 < 1) THEN
    ROLLBACK;
ELSE
    COMMIT;
END IF;

但我建议使用您最喜欢的编程语言中可用的语言包装器。

票数 98
EN

Stack Overflow用户

发布于 2013-02-26 21:51:01

我知道这是其他答案的重复,但它有一些情感上的支持,可以为测试更新采取额外的步骤:

为了测试更新,hash #是你的朋友。

如果您有一条update语句,如:

代码语言:javascript
复制
UPDATE 
wp_history
SET history_by="admin"
WHERE
history_ip LIKE '123%'

您散列更新并开始测试,然后将它们散列回来:

代码语言:javascript
复制
SELECT * FROM
#UPDATE
wp_history
#SET history_by="admin"
WHERE
history_ip LIKE '123%'

它适用于简单的语句。

另外一个实际上是强制性的解决方案是,每当对生产表使用update时,都要获取一个副本(备份副本)。Phpmyadmin > operations > copy: table_yearmonthday。表<=100M只需要几秒钟的时间。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11011384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档