UPUŚĆ, JEŚLI ISTNIEJE VS UPADZ?


163

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?


1
Jeśli szukasz gramatyki SQL Server, znajdziesz ją tutaj: stackoverflow.com/questions/7887011/ ...
Drew Delano

Myślę, że to powinno mieć znacznik w pytaniu dla jakiej konkretnej bazy danych.
Tom Stickel,

Odpowiedzi:


293

Standardowa składnia SQL to

DROP TABLE table_name;

IF EXISTSnie 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 to

DROP TABLE IF EXISTS table_name;

Pierwsza 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.

DROP TABLE table_name CASCADE;
DROP TABLE IF EXISTS table_name CASCADE;

Używaj CASCADE z wielką ostrożnością.


6
Pomyślałem, że wspomnę, że byłby naprawdę dobry pomysł, aby użyć go CASCADEw 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ś.
jbowman

3
DROP IF EXISTS (bez CASCADE) jest również dodawane w SQL Server 2016. Zobacz blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/ ...
Jovan MSFT

35

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ć

DROP TABLE IF EXISTS dbo.Table

W przypadku programu SQL Server <2016 wykonuję następujące czynności dla tabeli trwałej

IF OBJECT_ID('dbo.Table', 'U') IS NOT NULL 
  DROP TABLE dbo.Table; 

Lub to, na tymczasowy stół

IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
  DROP TABLE #T; 

17

Zapomniałeś tablew swojej składni:

drop table [table_name]

co upuszcza stół.

Za pomocą

drop table if exists [table_name]

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.


4
DROP TABLE IF EXISTS [table_name]

najpierw sprawdza, czy tabela istnieje, jeśli tak, usuwa tabelę while

DROP TABLE [table_name]

usuwa bez sprawdzania, więc jeśli nie istnieje, kończy działanie z błędem


3

Jeśli nie istnieje tabela o takiej nazwie, DROPkończy się niepowodzeniem z błędem, a DROP IF EXISTSpo 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 EXISTSi 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.


Warto również wspomnieć, że niektóre systemy RDBMS (w szczególności PostgreSQL) wyświetlają ostrzeżenie, jeśli spróbujesz, drop some_table if exists;a tabela some_tablenie istnieje.

Ach i oczywiście juegen d i Flakron mają rację. DROPwymaga określenia typu obiektu ( TABLEw tym przypadku)
SJuan76
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.