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
'Development Tip' 카테고리의 다른 글
SQL Server-한 db에서 다른 db로 저장 프로 시저 복사 (0) | 2020.10.09 |
---|---|
연산자 <<는 정확히 하나의 인수를 가져야합니다. (0) | 2020.10.09 |
Pytorch의 모델 요약 (0) | 2020.10.09 |
C에서 스택 추적을 어떻게 잡을 수 있습니까? (0) | 2020.10.09 |
Git : 1. 브랜치의 모든 파일 나열, 2. 다른 브랜치의 파일 비교 (0) | 2020.10.09 |