如何在运行之前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'