Подтвердить что ты не робот

Как проверить инструкцию SQL Update перед запуском?

В некоторых случаях запуск инструкции UPDATE в процессе производства может сохранить день. Однако обновление borked может быть хуже первоначальной проблемы.

За исключением использования тестовой базы данных, каковы параметры, чтобы определить, что будет делать оператор обновления перед запуском?

4b9b3361

Ответ 1

В дополнение к использованию транзакции, о которой сказал Имад (что должно быть обязательным в любом случае), вы также можете провести проверку работоспособности, на какие строки повлияет запуск выбора с использованием того же предложения WHERE, что и UPDATE.

Итак, если вы UPDATE

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

Ниже вы увидите, какие строки будут обновляться:

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

Ответ 2

Autocommit OFF...

MySQL

set autocommit=0;

Он отключает аутмит для текущего сеанса.

Вы выполняете свой оператор, видите, что он изменил, а затем откат, если он ошибается или совершает, если это то, что вы ожидали!

EDIT: преимущество использования транзакций вместо запуска запроса select заключается в том, что вы можете легко проверить полученный результат.

Ответ 3

Как насчет транзакций? У них есть функция ROLLBACK.

@see 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 f.e. вы могли бы написать что-то вроде этого (возможно, немного чище, но хотели быстро ответить;-)):

$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 Variables (см. https://dev.mysql.com/doc/refman/5.7/en/user-variables.htm l а также fooobar.com/questions/106286/... ):

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

Но я бы предложил использовать языковые оболочки, доступные на вашем любимом языке программирования.

Ответ 4

Я знаю, что это повторение других ответов, но у него есть некоторая эмоциональная поддержка, чтобы сделать дополнительный шаг для тестирования обновления: 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 > операции > copy: table_yearmonthday. Это займет всего несколько секунд для таблиц <= 100M.

Ответ 5

Не прямой ответ, но я видел много проблем с данными borded prod, которых можно было избежать, напечатать предложение WHERE сначала! Иногда WHERE 1 = 0 может помочь с безопасным размещением рабочего заявления. И может быть полезно посмотреть примерный план выполнения, который оценит затронутые строки. Кроме того, в транзакции, которую вы откатываете назад, как говорили другие.

Ответ 6

Запустить запрос выбора в той же таблице со всеми условиями where, которые вы применяете в запросе обновления.

Ответ 7

сделать SELECT,

как если бы вы получили

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

преобразуйте его в

SELECT * FROM users WHERE name='jan'