Czy ktoś może mi powiedzieć, czy jest jakaś różnica między
DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]
Pytam o to, ponieważ używam szablonu JDBC w mojej aplikacji internetowej MVC. Jeśli użyję DROP [TABLE_NAME]
błędu, powiedziałem, że tabela istnieje. A jeśli DROP IF EXISTS [TABLE_NAME]
go użyję, mówi zła gramatyka SQL. Czy ktoś może pomóc?
sql
drop-table
AbdulAziz
źródło
źródło
Odpowiedzi:
Standardowa składnia SQL to
IF EXISTS
nie jest standardowe; różne platformy mogą obsługiwać go z inną składnią lub w ogóle go nie obsługiwać. W PostgreSQL składnia toPierwsza z nich spowoduje błąd, jeśli tabela nie istnieje lub jeśli zależą od niej inne obiekty bazy danych. Najczęściej inne obiekty bazy danych będą odwołaniami do kluczy obcych, ale mogą też istnieć inne. (Na przykład widoki). Druga nie zgłosi błędu, jeśli tabela nie istnieje, ale nadal będzie zgłaszać błąd, jeśli inne obiekty bazy danych są od niej zależne.
Aby usunąć tabelę i wszystkie inne zależne od niej obiekty, użyj jednego z nich.
Używaj CASCADE z wielką ostrożnością.
źródło
CASCADE
w bloku transakcji (BEGIN
...COMMIT
). W ten sposób jest jasne, w jaki sposób wpłynie to na bazę danych, zanim potencjalnie zbombarduje zbiór danych, których być może nie chciałeś.Nie chodzi o to, o co bezpośrednio się prosi. Ale szukając, jak prawidłowo upuszczać tabele, natknąłem się na to pytanie, tak jak myślę, że wiele innych również.
Od SQL Server 2016+ możesz używać
W przypadku programu SQL Server <2016 wykonuję następujące czynności dla tabeli trwałej
Lub to, na tymczasowy stół
źródło
Zapomniałeś
table
w swojej składni:co upuszcza stół.
Za pomocą
sprawdza, czy tabela istnieje przed jej usunięciem.
Jeśli istnieje, zostanie upuszczony.
Jeśli nie, nie zostanie zgłoszony żaden błąd i nie zostanie podjęte żadne działanie.
źródło
najpierw sprawdza, czy tabela istnieje, jeśli tak, usuwa tabelę while
usuwa bez sprawdzania, więc jeśli nie istnieje, kończy działanie z błędem
źródło
Jeśli nie istnieje tabela o takiej nazwie,
DROP
kończy się niepowodzeniem z błędem, aDROP IF EXISTS
po prostu nic nie robi.Jest to przydatne, jeśli tworzysz / modyfikujesz bazę danych za pomocą skryptu; w ten sposób nie musisz ręcznie zapewniać usunięcia poprzednich wersji tabeli. Po prostu zrób
DROP IF EXISTS
i zapomnij o tym.Oczywiście twój obecny silnik DB może nie obsługiwać tej opcji, trudno jest powiedzieć więcej o błędzie na podstawie podanych informacji.
źródło
drop some_table if exists;
a tabelasome_table
nie istnieje.DROP
wymaga określenia typu obiektu (TABLE
w tym przypadku)