programing

SQL 쿼리를 실행하지 않고 테스트하는 명령이 있습니까? (MySQL 또는 ANSI SQL )

padding 2023. 10. 10. 20:09
반응형

SQL 쿼리를 실행하지 않고 테스트하는 명령이 있습니까? (MySQL 또는 ANSI SQL )

이와 같은 것이 있습니까?
TEST DELETE FROM user WHERE somekey = 45;

어떤 키가 존재하지 않거나 제약 조건 위반 등의 오류를 반환할 수 있으며, 몇 개의 행이 영향을 받는지 보고하지만 쿼리를 실행하지 않는 등의 오류를 반환할 수 있습니다.
어떤 행에도 쓰기나 삭제 효과가 없는 선택 쿼리에서도 쉽게 쿼리를 돌릴 수 있다는 것을 알고 있지만 오류가 발생할 수 있으며 많은 쿼리를 테스트하고 디버그하려면 그다지 실용적이지 않습니다.

제가 아는 유일한 것은 항상 롤백되는 트랜잭션으로 포장하는 것입니다.

BEGIN TRANSACTION

DELETE FROM user WHERE somekey = 45;

ROLLBACK TRANSACTION

삭제 문뿐만 아니라 전체 블록을 실행해야 합니다.또한 데이터를 손실할 여유가 없는 운영 환경이나 시스템에서는 이를 실행하지 마십시오.

MySQL 5.6 기준,EXPLAIN키워드가 작동합니다.SELECT,DELETE,INSERT,REPLACE,그리고.UPDATE진술들.

쿼리에 구문 오류가 있는 경우에는 여전히 실패하지만, 성공한 경우에는 EXPRESON의 결과만 표시되고 쿼리는 변경되지 않습니다.

기존 쿼리 앞에 "익스플레인"만 삽입하면 되므로 스키마 변경, 임시 테이블 사용, 트랜잭션 중단 등을 수행하는 것보다 훨씬 간단합니다.

자세한 내용 : https://dev.mysql.com/doc/refman/5.6/en/explain.html

MySQL에서는 다음을 사용합니다.

START TRANSACTION;
QUERY;

";"를 사용하는 것이 중요합니다. 왜냐하면 사용하지 않으면 작동하지 않기 때문입니다.예를들면

START TRANSACTION;
UPDATE tableX SET colX = valueA, colY = valueB WHERE id=1

여기 http://dev.mysql.com/doc/refman/5.0/en/commit.html 을 참조하십시오.

ANSI SQL: 아닙니다.

MySQL: 아마도.EXPLAINE 키워드는 원래 SELECT에서만 작동했지만 지금쯤에는 UPDATE 및 DELETE로 확장되었을 수 있습니다.

이건 좀 오래된 질문이지만 완전성을 위해서...

만약 어떤 행도 반환하지 않고 쿼리 처리 시간을 찾는 것이 목적이라면(이것이 꽤 자주 필요하므로 사용 중인 코드 조각이 몇 백만 개의 행을 반환하지 않고 얼마나 걸릴지 알고 싶습니다) 블랙홀 엔진은 매우 유용할 수 있습니다.

https://dev.mysql.com/doc/refman/8.0/en/blackhole-storage-engine.html

예를 들어 저는 t1과 t2라는 두 개의 테이블을 가지고 있고 수백만 개의 행을 가지고 있습니다.메모리를 소모하고 GUI가 처리되고 표시되는 데 시간이 걸리는 수백만 행을 반환하지 않고 GUI(SQLYog 또는 mysql workbench 등)에서 이것이 얼마나 걸릴지 확인하고 싶습니다.저는 블랙홀 엔진을 사용하여 행을 아무 곳에도 '덤핑'합니다.EG:

CREATE TABLE tBH (a TINYINT) ENGINE = BLACKHOLE;
SELECT NOW(); -- Show start time
INSERT tBH 
SELECT 1 FROM t1
LEFT JOIN t2 ON t1.key1 = t2.key1;
SELECT NOW(); -- Show end time

실행 시간을 찾고 있기 때문에 모든 열(즉, "*"로 표시된)을 반환하지 않고 자리 표시자("이 경우 1")만 반환합니다.

내가 알기로는 그런 일은 없습니다.게다가 만약 그렇지 않다면 그것은 오류가 되지 않을 것입니다.somekey값 45가 존재하지 않습니다.아무 것도 삭제하지 않을 겁니다.

Teradata SQL Assistant에서 이 작업을 수행할 수 있습니다.

약간.업데이트할 테이블이 있다고 가정합니다. "Entry".넌 할 수 있다.

SELECT Col1 = OTHER.Col4,
       Col2 = EXTRA.Col2,
FROM dbo.Entry E
    INNER JOIN MYOTHERTABLE OTHER ON OTHER.Id = E.Id
    INNER JOIN MYEXTRATABLE EXTRA ON EXTRA.Id = OTHER.Id

이 경우 Col1 및 Col2는 엔트리 테이블의 열입니다.글을쓰셨다면

UPDATE E
SET

초기 SELECT가 아닌 업데이트가 필요합니다.모든 시나리오에서 작동하는 것은 아니지만, 간단한 업데이트라면 이런 식으로 간단한 미리 보기를 할 수 있습니다.

이것은 오래된 질문이지만 오늘 같은 것을 찾은 후에 나는 그것을 약간 풀었습니다.

$prepResult = $connection->prepare($query);

대부분의 경우에 효과가 있는 것으로 보입니다. 즉, 구문은 안정적으로 확인하지만 데이터베이스에 대해 테스트하지는 않습니다.예를 들어 INT 열에 문자열을 삽입하거나 알 수 없는 테이블을 삭제하는 경우에도 실패하지 않습니다. 알 수 없는 테이블을 잘라내는 경우에도 마찬가지입니다.

자, 그러면 여기까지 데려다 줄 겁니다 - 반쯤은 ;)

언급URL : https://stackoverflow.com/questions/2433633/is-there-a-command-to-test-an-sql-query-without-executing-it-mysql-or-ansi-sq

반응형