programing

SQL Update 문을 실행하기 전에 테스트하는 방법

minecode 2022. 10. 1. 14:07
반응형

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

반응형