Czy używając MSSQL2005, mogę obciąć tabelę z ograniczeniem klucza obcego, jeśli najpierw obetnę tabelę potomną (tabelę z kluczem podstawowym relacji FK)?
Wiem, że mogę
- Użyj
DELETE
klauzuli „bez”, a następnieRESEED
tożsamości (lub) - Usuń FK, skróć tabelę i ponownie utwórz FK.
Myślałem, że tak długo, jak przycinam stolik dziecięcy przed rodzicem, będę w porządku bez robienia żadnej z powyższych opcji, ale pojawia się ten błąd:
Nie można obciąć tabeli „TableName”, ponieważ odwołuje się do niej klucz OBCY.
źródło
Pamiętaj, że nie jest to prawdopodobnie to, czego potrzebujesz, jeśli masz ponad milion rekordów, ponieważ jest to bardzo powolne.
źródło
Ponieważ
TRUNCATE TABLE
jest to polecenie DDL , nie może sprawdzić, czy rekordy w tabeli są przywoływane przez rekord w tabeli potomnej.Dlatego
DELETE
działa, aTRUNCATE TABLE
nie: ponieważ baza danych jest w stanie upewnić się, że nie odwołuje się do niej inny rekord.źródło
Bez
ALTER TABLE
Jako procedura składowana
https://github.com/reduardo7/TableTruncate
Pamiętaj, że nie jest to prawdopodobnie to, czego potrzebujesz, jeśli masz ponad milion rekordów, ponieważ jest to bardzo powolne.
źródło
Powyższe rozwiązanie @denver_citizen nie działało dla mnie, ale podobał mi się jego duch, więc zmodyfikowałem kilka rzeczy:
Z korzyścią dla społeczeństwa tutaj jest zaktualizowany skrypt:
źródło
użyj następującego polecenia po usunięciu wszystkich wierszy w tej tabeli przy użyciu instrukcji delete
EDYCJA: Poprawiona składnia dla SQL Server
źródło
TRUNCATE
pozwala uniknąć dziennika i jest znacznie szybszy niż wDELETE
przypadku dużych tabel. Jako takie nie jest to prawdziwe równoważne rozwiązanie.No cóż, skoro nie mogę znaleźć przykłady z bardzo prostego rozwiązania użyłem, który jest:
Oto jest:
1) Znajdź nazwę klucza obcego, który powoduje awarię (na przykład: FK_PROBLEM_REASON, z polem
ID
, z tabeliTABLE_OWNING_CONSTRAINT
) 2) Usuń ten klucz z tabeli:3) Obetnij poszukiwany stół
4) Ponownie dodaj klucz do pierwszej tabeli:
Otóż to.
źródło
Oto skrypt, który napisałem w celu zautomatyzowania procesu. Mam nadzieję, że to pomoże.
źródło
sys.foreign_keys
tabeli. ( Odniesienie )możesz wykonać ten krok,
reseeding table
Możesz usunąć dane z tabeli.jeśli wystąpi jakiś błąd, musisz ponownie ustawić tabelę podstawową.
źródło
Jeśli dobrze rozumiem, czego chcesz zrobić, to mieć czyste środowisko do skonfigurowania DB z testami integracji.
Moje podejście tutaj polegałoby na usunięciu całego schematu i odtworzeniu go później.
Powody:
źródło
źródło
Znalezione w innym miejscu w sieci
źródło
Nie można obciąć tabeli, jeśli nie usuniesz ograniczeń. Wyłączenie również nie działa. musisz upuścić wszystko. Stworzyłem skrypt, który usuwa wszystkie ograniczenia, a następnie je ponownie tworzę.
Pamiętaj o zawinięciu w transakcję;)
źródło
Odpowiedzi @denver_citizen i @Peter Szanto dla mnie nie działały, ale zmodyfikowałem je, aby uwzględnić:
źródło
obcinanie nie działało dla mnie, najlepszym rozwiązaniem jest usunięcie + ponowne uruchomienie. W przypadku niektórych z was, którzy muszą iterować ogromną liczbę tabel, aby wykonać usuwanie + ponowne uruchomienie, możesz napotkać problemy z niektórymi tabelami, które nie mają kolumny tożsamości, poniższy kod sprawdza, czy kolumna tożsamości istnieje przed podjęciem próby do ponownego posadzenia
źródło
Piszę następujące sposoby i próbowali je parametryzowane, więc można prowadzić je w
Query document
Lub Złóż przydatnymSP
z nich łatwo .A) Usuń
Jeśli twoja tabela nie ma milionów rekordów, działa to dobrze i nie ma żadnych poleceń Alter :
B) Obetnij
Jeśli twoja tabela ma miliony rekordów lub nie masz żadnych problemów z poleceniem Alter w swoich kodach, użyj tego:
źródło
To moje rozwiązanie tego problemu. Użyłem go do zmiany PK, ale pomysł jest taki sam. Mam nadzieję, że to się przyda)
źródło
Dla
MS SQL
przynajmniej nowsze wersje, można po prostu wyłączyć ograniczenia co z kodem jak poniżej:źródło
Poniższe działa dla mnie nawet z ograniczeniami FK i łączy następujące odpowiedzi, aby usunąć tylko określone tabele :
Uwaga:
Myślę, że nadal pomaga zadeklarować tabele w kolejności, w której chcesz je usunąć (tj. Najpierw zabić zależności). Jak widać w tej odpowiedzi , zamiast nazw specyficznych dla pętli można zastąpić wszystkie tabele
źródło
DELETE
to nie to samo coTRUNCATE
. Spowoduje to wypełnienie dzienników transakcji.Jeśli żadna z tych odpowiedzi nie działała tak jak w moim przypadku, wykonaj następujące czynności:
Powodzenia!
źródło
Usuń, a następnie zresetuj auto-przyrost:
następnie
źródło
Jedynym sposobem jest upuszczenie kluczy obcych przed wykonaniem obcięcia. Po obcięciu danych należy ponownie utworzyć indeksy.
Poniższy skrypt generuje wymagany SQL do usunięcia wszystkich ograniczeń klucza obcego.
Następnie poniższy skrypt generuje wymagany kod SQL do ponownego utworzenia kluczy obcych.
Uruchom wygenerowany skrypt, aby usunąć wszystkie klucze obce, skróć tabele, a następnie uruchom wygenerowany skrypt, aby odtworzyć wszystkie klucze obce.
Zapytania są pobierane stąd .
źródło
W SSMS miałem otwarty schemat pokazujący klucz. Po usunięciu klucza i obcięciu pliku odświeżyłem się, po czym ponownie skupiłem się na diagramie i utworzyłem aktualizację, czyszcząc, a następnie przywracając pole tożsamości. Zapisanie diagramu wywołało okno dialogowe Zapisz, a następnie okno dialogowe „Zmiany dokonano w bazie danych podczas pracy”. Kliknięcie przycisku Tak przywróciło klucz, przywracając go z zatrzaśniętej kopii na schemacie.
źródło
Jeśli robisz to z jakiejkolwiek częstotliwości, na przykład nawet według harmonogramu, absolutnie, jednoznacznie nigdy nie użyłbym instrukcji DML. Koszt zapisania do dziennika transakcji jest po prostu zbyt wysoki, a ustawienie całej bazy danych w
SIMPLE
tryb odzyskiwania w celu obcięcia jednej tabeli jest absurdalne.Najlepszym sposobem jest niestety trudny lub pracochłonny sposób. Ta istota:
Mój proces tego wymaga następujących kroków:
Skrypty tego rodzaju powinny być wykonywane w blokach
begin tran
icommit tran
.źródło
Właśnie odkryłem, że możesz używać tabeli TRUNCATE na tabeli nadrzędnej z ograniczeniami klucza obcego na obiekcie podrzędnym, o ile najpierw wyłączysz ograniczenia na tabeli podrzędnej . Na przykład
Klucz obcy CONSTRAINT child_par_ref w tabeli potomnej, referencje PARENT_TABLE
źródło
Najprostszy sposób:
1 - Wpisz w phpmyadmin
2 - Kliknij nazwę tabeli w lewej kolumnie
3 - Kliknij Operacja (górne menu)
4 - Kliknij „Opróżnij tabelę (TRUNCATE)
5 - Wyłącz pole” Włącz sprawdzanie klucza obcego ”
6 - Gotowe !
Link do samouczka graficznego
Samouczek: http://www.imageno.com/wz6gv1wuqajrpic.html
(przepraszam, nie mam wystarczającej reputacji, aby przesyłać zdjęcia tutaj: P)
źródło
Możesz spróbować
DELETE FROM <your table >;
.Serwer wyświetli nazwę ograniczenia i tabeli, a po usunięciu tej tabeli możesz usunąć to, czego potrzebujesz.
źródło
referencja - obciąć ograniczoną tabelę klucza obcego
Pracuje dla mnie w MYSQL
źródło