Se a tabela existir, solte a tabela e crie-a; se ela não existir, apenas crie-a

151

Estou perplexo, não sei como fazer isso.

Basicamente, eu apenas quero criar uma tabela, mas se ela existir, ela precisará ser descartada e recriada, não truncada, mas se ela não existir, apenas crie-a.

Alguém seria capaz de ajudar?

Obrigado George

George
fonte
@ Shomz, era o que eles queriam. No entanto, a existência dessa pergunta e as 20 mil visualizações desta página prova que isso é tão fácil quanto converter o inglês em grego.
Pacerier 20/03/2015
2
@Pacerier não poderia concordar mais: διαγραφή πίνακα, εφόσον υπάρχει.
Shomz 20/03/2015
@ Shomz, há um erro gramatical.
Pacerier 23/03

Respostas:

298

Basta colocar DROP TABLE IF EXISTS `tablename`;antes da sua CREATE TABLEdeclaração.

Essa instrução descarta a tabela, se existir, mas não emitirá um erro se não existir.

G-Nugget
fonte
1
Obrigado! Isso também funciona para uma lista de tabelas ou visualizações! DROP TABLE IF EXISTS 'table1', 'table2';e DROP VIEW IF EXISTS 'view1', 'view2';PS- Que bruxaria você usou para ter `s em código embutido !?
Campbeln
2
@ Campbeln Apenas dobre os backticks antes e depois do segmento de código. Backticks únicos são mostrados literalmente.
R3mainer 8/03/16
43

Basta usar DROP TABLE IF EXISTS:

DROP TABLE IF EXISTS `foo`;
CREATE TABLE `foo` ( ... );

Tente pesquisar a documentação do MySQL primeiro se tiver outros problemas.

r3mainer
fonte
8

Bem ... Huh. Durante anos, ninguém mencionou uma coisa sutil.

Apesar de DROP TABLE IF EXISTS `bla`; CREATE TABLE `bla` ( ... );parecer razoável, isso leva a uma situação em que a tabela antiga já se foi e a nova ainda não foi criada: alguns clientes podem tentar acessar a tabela de assuntos nesse momento.

A melhor maneira é criar uma tabela nova e trocá-la por uma antiga (o conteúdo da tabela é perdido):

CREATE TABLE `bla__new` (id int); /* if not ok: terminate, report error */
RENAME TABLE `bla__new` to `bla`; /* if ok: terminate, report success */
RENAME TABLE `bla` to `bla__old`, `bla__new` to `bla`;
DROP TABLE IF EXISTS `bla__old`;
  • Você deve verificar o resultado CREATE ...e não continuar em caso de erro , porque falha significa que outro encadeamento não terminou o mesmo script: porque ele travou no meio ou simplesmente não terminou ainda - é uma boa ideia inspecione as coisas sozinho.
  • Em seguida, verifique o resultado primeiro RENAME ...e não continue em caso de sucesso : toda a operação foi concluída com êxito; ainda mais, a execução seguinte RENAME ...pode (e será) insegura se outro encadeamento já tiver iniciado a mesma sequência (é melhor cobrir este caso do que não, veja a nota de bloqueio abaixo).
  • Segundo RENAME ...substitui atomicamente a definição da tabela, consulte o manual do MySQL para obter detalhes.
  • Por fim, DROP ...apenas limpa a mesa antiga, obviamente.

Agrupar todas as instruções com algo como SELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');permite apenas invocá-las seqüencialmente sem verificação de erro, mas não acho que seja uma boa ideia: a complexidade aumenta e as funções de bloqueio no MySQL não são seguras para replicação baseada em instruções.

Se os dados da tabela devem sobreviver à atualização da definição da tabela ... No caso geral, é uma história muito mais complexa sobre a comparação das definições da tabela para descobrir diferenças e produzir ALTER ...instruções apropriadas , o que nem sempre é possível automaticamente, por exemplo, quando as colunas são renomeadas.

Nota lateral 1: você pode lidar com visualizações usando a mesma abordagem, neste caso, CREATE/DROP TABLEapenas se transforma em CREATE/DROP VIEWenquanto RENAME TABLEpermanece inalterado. Na verdade, você pode até transformar a tabela em exibição e vice-versa.

CREATE VIEW `foo__new` as ...; /* if not ok: terminate, report error */
RENAME TABLE `foo__new` to `foo`; /* if ok: terminate, report success */
RENAME TABLE `foo` to `foo__old`, `foo__new` to `foo`;
DROP VIEW IF EXISTS `foo__old`;

Nota lateral 2: Os usuários do MariaDB devem estar satisfeitos com o CREATE OR REPLACE TABLE/VIEWassunto, que já se preocupa com o problema do assunto e seus pontos positivos.

Alex Offshore
fonte
1

Eu precisava soltar uma tabela e recriar com os dados de uma exibição. Eu estava criando uma tabela fora de uma visualização e foi isso que fiz:

DROP TABLE <table_name>;
CREATE TABLE <table_name> AS SELECT * FROM <view>;

O exemplo acima funcionou para mim usando o MySQL MariaDb.

Sirskoy
fonte
solte a tabela nome_da_tabela; crie tabela como selecione * na visualização;
21819 Sirskoy #
Se você está no MariaDB (o MySQL não possui isso), então você pode simplesmente #CREATE OR REPLACE <table_name> AS SELECT * FROM <view>;
Alex Offshore