Existe um comando para testar uma consulta SQL sem executá-la? (MySQL ou ANSI SQL)
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.
7 answers
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).
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.
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
ANSI SQL: No.
Talvez. A palavra-chave explicar originalmente funcionou apenas com SELECT, mas pode ter sido estendida para atualizar e excluir agora.somekey
com o valor 45. Não apagaria nada.
Pode utilizar F11 com Teradata SQL Assistente para fazer isto
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.