如何在运行之前testingSQL Update语句?

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

在使用testing数据库之前,有哪些选项可以告诉更新语句在运行之前会做什么?

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

所以,如果你更新

UPDATE foo SET bar = 42 WHERE col1 = 1 AND col2 = 'foobar'; 

以下将显示哪些行将被更新:

 SELECT * FROM foo WHERE col1 = 1 AND col2 = 'foobar'; 

自动提交OFF …

MySQL的

 set autocommit=0; 

它为当前会话设置自动closures。

你执行你的语句,看看它有什么变化,然后回滚,如果它是错误的,或者如果它是你所期望的提交!

编辑:使用事务而不是运行select查询的好处是,您可以更容易地检查结果集。

关于交易? 他们有ROLLBACK-Feature。

@请参阅https://dev.mysql.com/doc/refman/5.0/en/commit.html

例如:

 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中,你会写这样的东西(也许有点干净,但想快速回答;-)):

 $MysqlConnection->query('START TRANSACTION;'); $erg = $MysqlConnection->query('UPDATE MyGuests SET lastname='Doe' WHERE id=2;'); if($erg) $MysqlConnection->query('COMMIT;'); else $MysqlConnection->query('ROLLBACK;'); 

另一种方法是使用MySQLvariables(请参阅https://dev.mysql.com/doc/refman/5.7/en/user-variables.htm l和https://stackoverflow.com/a/18499823/1416909 ):

 # 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; 

但我会build议使用您最喜欢的编程语言提供的语言包装。

我知道这是其他答案的重复,但它有一些情感支持采取额外的步骤来testing更新:D

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

如果您有更新声明,如:

 UPDATE wp_history SET history_by="admin" WHERE history_ip LIKE '123%' 

你散列更新和设置进行testing,然后将它们回到:

 SELECT * FROM #UPDATE wp_history #SET history_by="admin" WHERE history_ip LIKE '123%' 

它适用于简单的语句。

另一个实际上是强制性的解决scheme是,每当在生产表上使用更新时,获取副本(备份副本)。 Phpmyadmin> operations> copy:table_yearmonthday。 表格<= 100M只需要几秒钟。

不是一个直接的答案,但是我已经看到许多borked prod数据的情况,可以通过首先键入WHERE子句来避免! 有时WHERE 1 = 0可以帮助安全地将工作声明放在一起。 并且查看估计的执行计划,这将估计受影响的行可能是有用的。 除此之外,你在其他人说过的交易中回滚。

在同一个表上运行select查询,并在更新查询中应用您正在应用的所有条件。

做一个SELECT它,

如果你有

UPDATE users SET id=0 WHERE name='jan'

将其转换为

SELECT * FROM users WHERE name='jan'