SQL Update 문을 실행하기 전에 테스트하는 방법
경우에 따라서는 실제 환경에서 UPDATE 문을 실행하면 문제를 해결할 수 있습니다.단, 볼록한 업데이트는 초기 문제보다 더 악화될 수 있습니다.
테스트 데이터베이스를 사용하는 것 외에 업데이트 문을 실행하기 전에 수행할 작업을 알려주는 옵션은 무엇입니까?
트랜잭션에 대해서는 어떻게 생각하십니까?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 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 변수를 사용하는 방법도 있습니다(https://dev.mysql.com/doc/refman/5.7/en/user-variables.html 및 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;
하지만 당신이 가장 좋아하는 프로그래밍 언어로 된 언어 포장지를 사용하는 것이 좋습니다.
Imad가 말한 대로 트랜잭션을 사용하는 것 외에(어차피 필수입니다), UPDATE와 동일한 WHERE 절을 사용하여 선택을 실행함으로써 영향을 받는 행의 건전성을 체크할 수도 있습니다.
UPDATE가
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;
현재 세션의 자동 커밋을 해제합니다.
스테이트먼트를 실행하여 무엇이 변경되었는지 확인한 후 잘못된 경우 롤백하고 예상대로라면 커밋합니다.
select 쿼리를 실행하는 대신 트랜잭션을 사용하면 결과 세트를 쉽게 확인할 수 있습니다.
테스트 업데이트의 경우 해시 #가 친구입니다.
다음과 같은 업데이트 문이 있는 경우:
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 > Operations > copy : table _ year monthday 。테이블이 = 100M 미만일 경우 몇 초면 됩니다.
먼저 절을 입력하면 피할 수 있는 엉성한 prod 데이터 상황을 많이 봐왔습니다!가끔WHERE 1 = 0
작업 스테이트먼트를 안전하게 정리하는 데도 도움이 됩니다.또한 영향을 받는 행을 추정하는 예상 실행 계획을 살펴보는 것이 유용할 수 있습니다.그 이상으로, 다른 사람들이 말한 대로 롤백하는 거래에서.
이 경우에도 하실 수 있습니다.WHERE FALSE
다른 이를
또 하나의 옵션은 MySQL에 쿼리 플랜을 요청하는 것입니다.두 가지 사실을 알 수 있습니다.
- 쿼리에 구문 오류가 있는지 여부. 있을 경우 쿼리 계획 명령 자체가 실패합니다.
- MySQL이 쿼리를 실행하는 방법(예: 어떤 인덱스를 사용할지)
및 는 MySQL SQL 쿼리 플랜이다.describe
다음 작업을 수행합니다.
describe update ...;
을 만들다SELECT
중에서, 에그 of of
손에 넣은 것처럼
UPDATE users SET id=0 WHERE name='jan'
그것을 로 변환하다.
SELECT * FROM users WHERE name='jan'
테스트하려는 경우에는 현재 열 값과 곧 업데이트될 열 값에만 초점을 맞추는 것이 좋습니다.
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
업데이트 쿼리에서 적용하는 조건.
언급URL : https://stackoverflow.com/questions/11011384/how-to-test-an-sql-update-statement-before-running-it
'programing' 카테고리의 다른 글
메서드를 스태틱으로 선언함으로써 얻을 수 있는 이점은 무엇입니까? (0) | 2022.10.01 |
---|---|
Java에서 현재 열려 있는 창/프로세스 목록을 가져오려면 어떻게 해야 합니까? (0) | 2022.10.01 |
haproxy를 mariadb 클러스터의 밴랜서로 사용하지만 쿼리 중에 연결이 끊어졌습니다. (0) | 2022.10.01 |
현재 스레드가 메인 스레드가 아닌지 확인하는 방법 (0) | 2022.10.01 |
SQL 데이터베이스 테이블의 n번째 행을 선택하려면 어떻게 해야 합니다. (0) | 2022.10.01 |