Jestem zakłopotany, nie wiem, jak się do tego zabrać.
Zasadniczo chcę tylko utworzyć tabelę, ale jeśli istnieje, należy ją usunąć i ponownie utworzyć, a nie skrócić, ale jeśli nie istnieje, po prostu ją utwórz.
Czy ktoś byłby w stanie pomóc?
Dzięki, George
διαγραφή πίνακα, εφόσον υπάρχει
.Odpowiedzi:
Po prostu umieść
DROP TABLE IF EXISTS `tablename`;
przedCREATE TABLE
oświadczeniem.Ta instrukcja usuwa tabelę, jeśli istnieje, ale nie zgłosi błędu, jeśli tak nie jest.
źródło
DROP TABLE IF EXISTS 'table1', 'table2';
iDROP VIEW IF EXISTS 'view1', 'view2';
PS: Jakie czary użyłeś, aby mieć wbudowany kod !?Po prostu użyj
DROP TABLE IF EXISTS
:Spróbuj najpierw przeszukać dokumentację MySQL, jeśli masz inne problemy.
źródło
Cóż ... Huh. Od lat nikt nie wspomniał o jednej subtelnej rzeczy.
Mimo,
DROP TABLE IF EXISTS `bla`; CREATE TABLE `bla` ( ... );
że wydaje się to rozsądne, prowadzi to do sytuacji, w której stary stół już nie istnieje, a nowy nie został jeszcze utworzony: jakiś klient może w tym momencie próbować uzyskać dostęp do tabeli tematów.Lepszym sposobem jest utworzenie zupełnie nowej tabeli i zamiana jej na starą (zawartość tabeli jest tracona):
CREATE ...
i nie kontynuować w przypadku błędu , ponieważ awaria oznacza, że inny wątek nie zakończył tego samego skryptu: albo zawiesił się w środku, albo po prostu jeszcze się nie skończył - dobrze sprawdź rzeczy samodzielnie.RENAME ...
i nie kontynuować w przypadku sukcesu : cała operacja została zakończona pomyślnie; Co więcej, uruchomienie następnegoRENAME ...
może (i będzie) niebezpieczne, jeśli inny wątek już rozpoczął tę samą sekwencję (lepiej omówić ten przypadek niż nie, patrz uwaga na temat blokowania poniżej).RENAME ...
niepodzielnie zastępuje definicję tabeli, szczegółowe informacje można znaleźć w podręczniku MySQL .DROP ...
oczywiście po prostu sprząta stary stół.Zawijanie wszystkich instrukcji czymś takim jak
SELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');
pozwala po prostu wywoływać wszystkie instrukcje sekwencyjnie bez sprawdzania błędów, ale nie sądzę, aby to był dobry pomysł: zwiększa się złożoność i funkcje blokujące w MySQL nie są bezpieczne dla replikacji opartej na instrukcjach.Jeśli dane tabeli powinny przetrwać aktualizację definicji tabeli ... W ogólnym przypadku jest to znacznie bardziej złożona historia o porównywaniu definicji tabel w celu znalezienia różnic i stworzenia odpowiedniego
ALTER ...
zestawienia, co nie zawsze jest możliwe automatycznie, np. Przy zmianie nazw kolumn.Uwaga dodatkowa 1: Możesz radzić sobie z widokami, używając tego samego podejścia, w tym przypadku
CREATE/DROP TABLE
po prostu przekształca się wCREATE/DROP VIEW
podczas gdyRENAME TABLE
pozostaje niezmieniony. W rzeczywistości możesz nawet zmienić tabelę w widok i odwrotnie.Uwaga dodatkowa 2: użytkownicy MariaDB powinni być zadowoleni
CREATE OR REPLACE TABLE/VIEW
, która już dba o problem tematyczny i to jest dobre punkty.źródło
Musiałem usunąć tabelę i utworzyć ją ponownie z danymi z widoku. Tworzyłem tabelę z widoku i tak zrobiłem:
Powyższe działało dla mnie przy użyciu MySQL MariaDb.
źródło
CREATE OR REPLACE <table_name> AS SELECT * FROM <view>;