Есть ли команда для проверки SQL-запроса без его выполнения? (MySQL или ANSI SQL) - PullRequest
22 голосов
/ 12 марта 2010

Есть что-нибудь подобное:
TEST DELETE FROM user WHERE somekey = 45;

Это может возвращать любые ошибки, например, что somekey не существует, или какое-либо нарушение ограничения или что-то еще, и сообщать, сколько строк будет затронуто, но не выполнять запрос?
Я знаю, что вы можете легко превратить любой запрос в запрос на выборку, который не имеет эффекта записи или удаления в любой строке, но это может привести к ошибкам, и это не очень удобно, если вы хотите протестировать и отладить много запросов.

Ответы [ 8 ]

38 голосов
/ 12 марта 2010

Единственное, что я знаю, это заключить его в транзакцию, которая всегда откатывается:

BEGIN TRANSACTION

DELETE FROM user WHERE somekey = 45;

ROLLBACK TRANSACTION

Убедитесь, что вы выполняете весь блок, а не только оператор delete. Кроме того, НЕ запускайте это в любой производственной среде или любой системе, в которой вы не можете позволить себе потерять данные.

8 голосов
/ 28 января 2013

В 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

5 голосов
/ 12 марта 2010

ANSI SQL: №

MySQL: возможно. Ключевое слово EXPLAIN изначально работало только с SELECT, но оно могло быть расширено до UPDATE и DELETE.

3 голосов
/ 10 декабря 2018

Начиная с MySQL 5.6, ключевое слово EXPLAIN работает с операторами SELECT, DELETE, INSERT, REPLACE и UPDATE.

Если в вашем запросе есть синтаксическая ошибка, он все равно не будет выполнен, однако в случае успеха вы увидите только результаты EXPLAIN и запрос не внесет никаких изменений.

Это гораздо проще, чем вносить изменения в схему, использовать временные таблицы или прерывать транзакции, поскольку все, что вам нужно сделать, это вставить "EXPLAIN" перед существующим запросом.

Дополнительная информация: https://dev.mysql.com/doc/refman/5.6/en/explain.html

1 голос
/ 08 июня 2018

Я понимаю, что это немного старый вопрос, но для полноты ...

Если цель состоит в том, чтобы найти время обработки запроса без возврата каких-либо строк (мне это нужно довольно часто, я хочу знать, сколько времени займет фрагмент кода, который я использую, без того, чтобы он возвращал пару миллионов строк не интересно смотреть) тогда двигатель BLACKHOLE может быть очень полезен:

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

Например, скажем, у меня есть 2 таблицы, t1 и t2, с миллионами строк, которые я объединяю. Я хочу проверить, сколько времени это может занять в графическом интерфейсе (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

Обратите внимание, что, поскольку я просто ищу время выполнения, я не беспокоюсь о возврате всех столбцов (например, IE с "*"), а просто заполнителя (в данном случае "1").

0 голосов
/ 11 мая 2017

Вид. Скажем, у вас есть таблица, которую вы хотите обновить: «Запись». Вы можете

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 являются столбцами таблицы Entry. Если вы написали

UPDATE E
SET

вместо начального SELECT у вас будет обновление. Это не работает для всех сценариев, но, если это простое обновление, вы можете получить быстрый предварительный просмотр таким образом.

0 голосов
/ 12 апреля 2016

Вы можете использовать F11 с Teradata SQL Assistant, чтобы сделать это

0 голосов
/ 12 марта 2010

Насколько мне известно, такой вещи не существует. Кроме того, это не было бы ошибкой, если бы не somekey со значением 45 не существовало. Это просто ничего не удалит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...