Подтвердить что ты не робот

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

Есть ли что-нибудь вроде этого:
TEST DELETE FROM user WHERE somekey = 45;

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

4b9b3361

Ответ 1

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

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

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

Например, скажем, у меня есть 2 таблицы, t1 и t2, с миллионами строк, которые я объединяю. Я хочу проверить, сколько времени это может занять, в графическом интерфейсе (SQLYog или MySQL Workbench или что-то подобное), не возвращая миллионы строк, которые будут занимать память и предположительно займет время для обработки и отображения графического интерфейса. Я использую двигатель черной дыры, чтобы "сбросить" ряды в никуда. НАПРИМЕР:

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").

Ответ 2

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

BEGIN TRANSACTION

DELETE FROM user WHERE somekey = 45;

ROLLBACK TRANSACTION

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

Ответ 3

В 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

Ответ 4

ANSI SQL: Нет.

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

Ответ 5

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

Ответ 6

Вы можете использовать F11 с помощью Teradata SQL Assistant для этого

Ответ 7

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

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, у вас будет ваше обновление. Он не работает для всех сценариев, но если это простое обновление, вы можете получить быстрый просмотр таким образом.

Ответ 8

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

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

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