В некоторых случаях выполнение оператора UPDATE в производственной среде может спасти положение. Однако неудачное обновление может быть хуже, чем первоначальная проблема.
Какие есть варианты, кроме тестовой базы данных, чтобы узнать, что будет делать оператор обновления перед его запуском?
FOREIGN KEY UPDATE CASCADE
получается sqlА как насчет транзакций? У них есть функция ROLLBACK.
@ см. 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 fe вы бы написали что-то вроде этого (возможно, немного чище, но хотелось бы быстро ответить ;-)):
$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.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;
Но я бы посоветовал использовать языковые оболочки, доступные на вашем любимом языке программирования.
источник
Автокоммит ВЫКЛ ...
MySQL
set autocommit=0;
Он отключает автоматизацию для текущего сеанса.
Вы выполняете свой оператор, видите, что он изменился, а затем откатываетесь, если он неверен, или фиксируете, если это то, что вы ожидали!
РЕДАКТИРОВАТЬ: Преимущество использования транзакций вместо выполнения запроса выбора заключается в том, что вы можете легче проверить полученный набор.
источник
Я знаю, что это повторение других ответов, но у него есть некоторая эмоциональная поддержка, чтобы сделать дополнительный шаг для тестирования обновления: D
Для тестирования обновления хеш # - ваш друг.
Если у вас есть заявление об обновлении, например:
UPDATE wp_history SET history_by="admin" WHERE history_ip LIKE '123%'
Вы хешируете UPDATE и SET для тестирования, а затем снова хешируете их:
SELECT * FROM #UPDATE wp_history #SET history_by="admin" WHERE history_ip LIKE '123%'
Это работает для простых утверждений.
Дополнительным практически обязательным решением является получение копии (дубликата резервной копии) при каждом обновлении производственной таблицы. Phpmyadmin> операции> копировать: table_yearmonthday. Для таблиц <= 100M требуется всего несколько секунд.
источник
Это не прямой ответ, но я видел много проблем с данными prod, которых можно было избежать, если
WHERE
сначала ввести предложение ! ИногдаWHERE 1 = 0
может помочь и безопасное составление рабочего утверждения. И просмотр ориентировочного плана выполнения, который оценит затронутые строки, может быть полезным. Кроме того, в транзакции, которую вы откатываете, как говорили другие.источник
WHERE 1 = 0
более переносимо, если кто-нибудь столкнется с этим, кто работает с другой СУБД. Например, SQL Server не приметWHERE FALSE
.В тех случаях, которые вы хотите протестировать, рекомендуется сосредоточиться только на текущих значениях столбцов и значениях столбцов, которые скоро будут обновлены .
Взгляните на следующий код, который я написал для обновления цен WHMCS:
# UPDATE tblinvoiceitems AS ii SELECT ### JUST ii.amount AS old_value, ### FOR h.amount AS new_value ### TESTING FROM tblinvoiceitems AS ii ### PURPOSES. JOIN tblhosting AS h ON ii.relid = h.id JOIN tblinvoices AS i ON ii.invoiceid = i.id WHERE ii.amount <> h.amount ### Show only updatable rows # SET ii.amount = h.amount
Таким образом мы четко сравниваем уже существующие значения с новыми значениями.
источник
Запустите запрос выбора в той же таблице со всеми
where
условиями, которые вы применяете в запросе на обновление.источник
сделать
SELECT
из этого,как если бы у тебя
UPDATE users SET id=0 WHERE name='jan'
преобразовать это в
SELECT * FROM users WHERE name='jan'
источник
Еще один вариант - запросить у MySQL план запроса. Это говорит вам о двух вещах:
В MySQL и большинстве баз данных SQL команда плана запроса выглядит
describe
так:describe update ...;
источник