Existe um comando para testar uma consulta SQL sem executá-la? (MySQL ou ANSI SQL)

Há alguma coisa assim?:
TEST DELETE FROM user WHERE somekey = 45;

isso pode devolver quaisquer erros, por exemplo que o somekey não exista, ou alguma violação de restrições ou qualquer coisa, e relatar quantas linhas seriam afetadas, mas não executar a consulta?
Eu sei que você pode facilmente virar qualquer consulta em uma consulta selecionada que não tem nenhum efeito de escrita ou exclusão em qualquer linha, mas que pode levar a erros e não é muito prático se você quiser testar e depurar muitas consultas.

Author: Petruza, 2010-03-12

7 answers

Sei que esta é uma pergunta antiga, mas para ser completa...

Se a intenção é encontrar o tempo de processamento da consulta sem retornar todas as linhas (eu preciso disto muitas vezes, eu quero saber quanto tempo um pedaço de código eu estou usando vai dar, sem ter que retornar um par de milhões de linhas eu não estou interessado em ver), o BLACKHOLE motor pode ser muito útil:

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

Para instance say I have 2 tables, t1 & t2, with millions of rows, that I am joining together. Eu quero verificar quanto tempo isso é provável de levar, em uma GUI (SQLYog ou mysql workbench ou somesuch) sem retornar milhões de linhas que irão comer a memória e, presumivelmente, levar tempo para o GUI para processar e exibir. Uso o motor blackhole para "despejar" as linhas para lado nenhum. 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

Note que como estou apenas à procura de tempo de execução, não me dou ao trabalho de devolver todas as colunas (ou seja, com"*"), mas apenas um substituto ("1" Neste caso).

 0
Author: Giles, 2018-06-08 10:52:58

A única coisa que sei é embrulhá-la numa transacção que é sempre enrolada para trás:

BEGIN TRANSACTION

DELETE FROM user WHERE somekey = 45;

ROLLBACK TRANSACTION

Certifique-se que executa o bloco inteiro e não apenas a declaração de eliminação. Além disso, não execute isso em qualquer ambiente de produção ou qualquer sistema onde você não pode dar ao luxo de perder os dados.

 34
Author: NYSystemsAnalyst, 2010-03-12 15:16:05

Em MySQL use este

START TRANSACTION;
QUERY;

É importante usar ";" porque se não o fizeres, não vai funcionar. Por exemplo

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

Referência aqui http://dev.mysql.com/doc/refman/5.0/en/commit.html

 8
Author: 絢瀬絵里, 2013-01-28 07:18:33

ANSI SQL: No.

Talvez. A palavra-chave explicar originalmente funcionou apenas com SELECT, mas pode ter sido estendida para atualizar e excluir agora.
 5
Author: Larry Lustig, 2017-01-31 15:18:32
Que eu saiba, isso não existe. Além disso, não seria um erro se não existisse nenhum somekey com o valor 45. Não apagaria nada.
 0
Author: Klaus Byskov Pedersen, 2010-03-12 15:17:55

Pode utilizar F11 com Teradata SQL Assistente para fazer isto

 0
Author: Brandon See, 2016-04-12 19:32:24
Mais ou menos. Digamos que você tem uma tabela que você quer atualizar: "Entry". Você pode
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

Neste caso, Col1 e Col2 são colunas do quadro de entradas. Se escreveu

UPDATE E
SET

Em vez da selecção inicial, terias a tua actualização. Não funciona para todos os cenários, mas, se for uma atualização simples, você pode obter uma prévia rápida desta forma.

 0
Author: Jon S, 2017-05-11 06:09:59