Development Tip

SQL Update 문을 실행하기 전에 테스트하는 방법은 무엇입니까?

yourdevel 2020. 10. 9. 12:28
반응형

SQL Update 문을 실행하기 전에 테스트하는 방법은 무엇입니까?


경우에 따라 프로덕션에서 UPDATE 문을 실행하면 하루를 절약 할 수 있습니다. 그러나 지루한 업데이트는 초기 문제보다 더 나쁠 수 있습니다.

테스트 데이터베이스를 사용하지 않고 업데이트 문을 실행하기 전에 수행 할 작업을 알려주는 옵션은 무엇입니까?


Imad가 말한 것처럼 트랜잭션을 사용하는 것 외에도 (어쨌든 필수 사항이어야 함) UPDATE와 동일한 WHERE 절을 사용하여 선택을 실행하여 영향을받는 행을 온 전성 검사 할 수도 있습니다.

따라서 UPDATE가

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

다음은 업데이트 될 행을 보여줍니다.

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

거래는 어떻습니까? 롤백 기능이 있습니다.

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

현재 세션에 대해 autommit을 해제합니다.

문을 실행하고 변경된 내용을 확인한 다음 잘못된 경우 롤백하거나 예상 한대로 커밋합니다!

편집 : 선택 쿼리를 실행하는 대신 트랜잭션을 사용하는 이점은 결과 집합을 더 쉽게 확인할 수 있다는 것입니다.


I know this is a repeat of other answers, but it has some emotional support to take the extra step for testing update :D

For testing update, hash # is your friend.

If you have an update statement like:

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

You hash UPDATE and SET out for testing, then hash them back in:

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

It works for simple statements.

An additional practically mandatory solution is, to get a copy (backup duplicate), whenever using update on a production table. Phpmyadmin > operations > copy: table_yearmonthday. It just takes a few seconds for tables <=100M.


Not a direct answer, but I've seen many borked prod data situations that could have been avoided by typing the WHERE clause first! Sometimes a WHERE 1 = 0 can help with putting a working statement together safely too. And looking at an estimated execution plan, which will estimate rows affected, can be useful. Beyond that, in a transaction that you roll back as others have said.


Run select query on same table with all where conditions you are applying in update query.


make a SELECT of it,

like if you got

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

convert it to

SELECT * FROM users WHERE name='jan'


In these cases that you want to test, it's a good idea to focus on only current column values and soon-to-be-updated column values.

Please take a look at the following code that I've written to update WHMCS prices:

# 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

This way we clearly compare already existing values versus new values.

참고URL : https://stackoverflow.com/questions/11011384/how-to-test-an-sql-update-statement-before-running-it

반응형