Есть ли команда для проверки SQL-запроса без его выполнения? (MySQL или ANSI SQL)
Есть ли что-нибудь вроде этого:
TEST DELETE FROM user WHERE somekey = 45;
Это может возвращать любые ошибки, например, что somekey не существует или какое-либо нарушение ограничений или что-либо еще, и сообщает, сколько строк будет затронуто, но не выполнит запрос?
Я знаю, что вы можете легко превратить любой запрос в запрос выбора, который не имеет эффекта записи или удаления в любой строке, но это может привести к ошибкам, и это не очень практично, если вы хотите протестировать и отладить многие запросы.
Ответы
Ответ 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.