경우에 따라 프로덕션에서 UPDATE 문을 실행하면 하루를 절약 할 수 있습니다. 그러나 지루한 업데이트는 초기 문제보다 더 나쁠 수 있습니다.
테스트 데이터베이스를 사용하지 않는 한 업데이트 문을 실행하기 전에 수행 할 작업을 알려주는 옵션은 무엇입니까?
경우에 따라 프로덕션에서 UPDATE 문을 실행하면 하루를 절약 할 수 있습니다. 그러나 지루한 업데이트는 초기 문제보다 더 나쁠 수 있습니다.
테스트 데이터베이스를 사용하지 않는 한 업데이트 문을 실행하기 전에 수행 할 작업을 알려주는 옵션은 무엇입니까?
답변:
Imad가 말한대로 트랜잭션을 사용하는 것 외에도 (어쨌든 필수 사항이어야 함) UPDATE와 동일한 WHERE 절을 사용하여 select를 실행하여 영향을받는 행을 온 전성 검사 할 수도 있습니다.
따라서 UPDATE가
UPDATE foo
SET bar = 42
WHERE col1 = 1
AND col2 = 'foobar';
다음은 업데이트 될 행을 보여줍니다.
SELECT *
FROM foo
WHERE col1 = 1
AND col2 = 'foobar';
FOREIGN KEY UPDATE CASCADE
SQL이 실패하면
거래는 어떻습니까? 롤백 기능이 있습니다.
@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
일반적으로이 행은 한 번 실행되지 않습니다. 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을 해제합니다.
문을 실행하고 변경 사항을 확인한 다음 잘못된 경우 롤백하거나 예상 한대로 커밋합니다!
편집 : 선택 쿼리를 실행하는 대신 트랜잭션을 사용하는 이점은 결과 집합을 더 쉽게 확인할 수 있다는 것입니다.
나는 이것이 다른 답변의 반복이라는 것을 알고 있지만 업데이트 테스트를 위해 추가 단계를 수행하기 위해 감정적 인 지원이 있습니다 : 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> 작업> 복사 : table_yearmonthday. 테이블이 100M 미만인 경우 몇 초 밖에 걸리지 않습니다.
직접적인 대답은 아니지만 , WHERE
절을 먼저 입력하여 피할 수있는 지루한 데이터 상황을 많이 보았습니다 ! 때때로 a WHERE 1 = 0
는 작업 진술을 안전하게 작성하는 데 도움이 될 수 있습니다. 영향을받는 행을 추정하는 예상 실행 계획을 살펴 보는 것도 유용 할 수 있습니다. 그 외에도 다른 사람들이 말한 것처럼 롤백하는 트랜잭션에서.
WHERE 1 = 0
다른 DBMS로 작업하는 사람이 있으면 더 이식성이 좋습니다. 예를 들어 SQL Server는 WHERE FALSE
.
테스트하려는 이러한 경우에는 현재 열 값과 곧 업데이트 될 열 값 에만 집중하는 것이 좋습니다 .
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
업데이트 쿼리에서 적용 하는 모든 조건 으로 동일한 테이블에서 선택 쿼리를 실행 합니다.
SELECT
그것을 만들어라.
당신이 얻은 것처럼
UPDATE users SET id=0 WHERE name='jan'
그것을 변환
SELECT * FROM users WHERE name='jan'