Jeśli chcę usunąć wszystkie tabele z mojej bazy danych w ten sposób, czy zajmie się ograniczeniem klucza obcego? Jeśli nie, jak mam się tym najpierw zająć?
GO
IF OBJECT_ID('dbo.[Course]','U') IS NOT NULL
DROP TABLE dbo.[Course]
GO
IF OBJECT_ID('dbo.[Student]','U') IS NOT NULL
DROP TABLE dbo.[Student]
Odpowiedzi:
Nie, to nie spowoduje usunięcia tabeli, jeśli rzeczywiście istnieją do niej odwołania do obcych kluczy.
Aby uzyskać wszystkie relacje klucza obcego odwołujące się do tabeli, możesz użyć tego języka SQL (jeśli korzystasz z SQL Server 2005 i nowszych):
a jeśli istnieją, za pomocą tej instrukcji tutaj można utworzyć instrukcje SQL, które faktycznie usuwają te relacje FK:
źródło
W SQL Server Management Studio 2008 (R2) i nowszych można kliknąć prawym przyciskiem myszy plik
Wybierz tabele, które chcesz upuścić.
Wybierz „Zapisz w nowym oknie zapytania”.
Kliknij przycisk Zaawansowane.
Ustaw Script DROP i CREATE na Script DROP.
Ustaw klucze obce skryptu na True.
Kliknij OK.
Kliknij Dalej -> Dalej -> Zakończ.
Wyświetl skrypt, a następnie wykonaj.
źródło
Jeśli najpierw usuniesz tabelę podrzędną, klucz obcy również zostanie usunięty. Jeśli spróbujesz najpierw usunąć tabelę „nadrzędną”, otrzymasz komunikat „Nie można usunąć obiektu 'a', ponieważ odwołuje się do niego ograniczenie KLUCZ OBCY”. błąd.
źródło
Oto inny sposób na poprawne usunięcie wszystkich tabel przy użyciu
sp_MSdropconstraints
procedury. Najkrótszy kod, jaki mogłem wymyślić:źródło
Jeśli jest to SQL Server, musisz usunąć ograniczenie, zanim będzie można usunąć tabelę.
źródło
Nieco bardziej ogólna wersja tego, co opublikował @mark_s, pomogło mi
po prostu podłącz nazwę swojej tabeli i wykonaj jej wynik.
źródło
Oto inny sposób usunięcia wszystkich ograniczeń, po których następują same tabele, przy użyciu sztuczki konkatenacji polegającej
FOR XML PATH('')
na połączeniu wielu wierszy wejściowych w jeden wiersz wyjściowy. Powinien działać na czymkolwiek SQL 2005 i nowszym.Zostawiłem polecenia EXECUTE zakomentowane ze względów bezpieczeństwa.
źródło
Oto kompletny skrypt do wdrożenia rozwiązania:
źródło
źródło
Za pomocą programu SQL Server Manager można usunąć ograniczenia klucza obcego z interfejsu użytkownika. Jeśli chcesz usunąć tabelę,
Diary
ale tabela User ma klucz obcyDiaryId
wskazujący naDiary
tabelę, możesz rozwinąć tabelę (używając symbolu plusa),User
a następnie rozwinąćForeign Keys
sekcję. Kliknij prawym przyciskiem myszy klucz obcy wskazujący na tabelę dziennika, a następnie wybierzDelete
. Następnie możesz rozwinąćColumns
sekcję, kliknąć prawym przyciskiem myszy i usunąć również kolumnęDiaryId
. Następnie możesz po prostu biegać:Wiem, że Twoje pytanie dotyczy usunięcia wszystkich tabel, więc może to nie być przydatne w tym przypadku. Jeśli jednak chcesz tylko usunąć kilka tabel, uważam, że jest to przydatne (tytuł nie wspomina wyraźnie o usunięciu wszystkich tabel).
źródło
Jeśli jesteś na serwerze mysql i nie masz nic przeciwko utracie tabel, możesz użyć prostego zapytania, aby usunąć wiele tabel naraz:
W ten sposób nie ma znaczenia, w jakiej kolejności używasz tabeli w zapytaniu.
Jeśli ktoś ma zamiar coś powiedzieć o tym, że nie jest to dobre rozwiązanie, jeśli masz bazę danych z wieloma tabelami: Zgadzam się!
źródło
Incorrect syntax near '='. (102) (SQLExecDirectW)
foreign_key_checks
nie będzie działać na serwerze MSSQL. Myślę, że to zmienna specyficzna dla MySql.wykonaj poniższy kod, aby uzyskać nazwę ograniczenia klucza obcego, które blokuje upuszczanie. Na przykład biorę
roles
stół.otrzymasz nazwę FK, jak poniżej:
FK__Table1__roleId__1X1H55C1
teraz uruchom poniższy kod, aby usunąć odwołanie FK otrzymane z góry.
Gotowe!
źródło
Wtedy dużo łatwiej jest usunąć całą bazę danych:
źródło
Jeśli chcesz skorzystać z
DROP
tabeli, do której odwołuje się inna tabela, używając klucza obcegoDROP TABLE *table_name* CASCADE CONSTRAINTS;
Myślę, że to powinno działać dla Ciebie.
źródło
cascade constraints
na serwerze sql