Kann ich mit MSSQL2005 eine Tabelle mit einer Fremdschlüsseleinschränkung abschneiden, wenn ich zuerst die untergeordnete Tabelle (die Tabelle mit dem Primärschlüssel der FK-Beziehung) abschneide?
Ich weiß, dass ich es auch kann
- Verwenden Sie eine
DELETE
ohne where-Klausel und dannRESEED
die Identität (oder) - Entfernen Sie die FK, schneiden Sie die Tabelle ab und erstellen Sie die FK neu.
Ich dachte, solange ich die untergeordnete Tabelle vor der übergeordneten Tabelle abgeschnitten habe, wäre ich in Ordnung, ohne eine der oben genannten Optionen auszuführen, aber ich erhalte den folgenden Fehler:
Die Tabelle 'TableName' kann nicht abgeschnitten werden, da auf sie durch eine FOREIGN KEY-Einschränkung verwiesen wird.
quelle
Beachten Sie, dass dies wahrscheinlich nicht das ist, was Sie möchten, wenn Sie über Millionen von Datensätzen verfügen, da es sehr langsam ist.
quelle
Da
TRUNCATE TABLE
es sich um einen DDL-Befehl handelt , kann nicht überprüft werden, ob auf die Datensätze in der Tabelle von einem Datensatz in der untergeordneten Tabelle verwiesen wird.Dies
DELETE
funktioniert undTRUNCATE TABLE
funktioniert nicht: weil die Datenbank sicherstellen kann, dass sie nicht von einem anderen Datensatz referenziert wird.quelle
Ohne
ALTER TABLE
Als gespeicherte Prozedur
https://github.com/reduardo7/TableTruncate
Hinweis dass dies wahrscheinlich nicht das ist, was Sie möchten, wenn Sie über Millionen von Datensätzen verfügen, da es sehr langsam ist.
quelle
Die oben bereitgestellte Lösung @denver_citizen hat bei mir nicht funktioniert, aber ich mochte den Geist davon, also habe ich einige Dinge geändert:
Zum Wohle der Öffentlichkeit ist hier das aktualisierte Skript:
quelle
Verwenden Sie den folgenden Befehl, nachdem Sie alle Zeilen in dieser Tabelle mit der Anweisung delete gelöscht haben
BEARBEITEN: Syntax für SQL Server korrigiert
quelle
TRUNCATE
vermeidet das Protokoll und ist erheblich schneller alsDELETE
bei großen Tabellen. Insofern ist dies keine echte äquivalente Lösung.Nun, da ich keine Beispiele für die sehr einfache Lösung gefunden habe, die ich verwendet habe:
Hier kommt's:
1) Suchen Sie den Fremdschlüsselnamen, der den Fehler verursacht (zum Beispiel: FK_PROBLEM_REASON, mit Feld
ID
, aus TabelleTABLE_OWNING_CONSTRAINT
). 2) Entfernen Sie diesen Schlüssel aus der Tabelle:3) Gesuchte Tabelle abschneiden
4) Fügen Sie den Schlüssel erneut zu dieser ersten Tabelle hinzu:
Das ist es.
quelle
Hier ist ein Skript, das ich geschrieben habe, um den Prozess zu automatisieren. Ich hoffe, es hilft.
quelle
sys.foreign_keys
Tabelle. ( Referenz )Sie können diesen Schritt ausführen, indem
reseeding table
Sie die Daten der Tabelle löschen können.Wenn ein Fehler auftritt, müssen Sie die Primärtabelle erneut setzen.
quelle
quelle
Wenn ich das richtig verstehe, möchten Sie eine saubere Umgebung für die Datenbank einrichten, die Integrationstests umfasst.
Mein Ansatz hier wäre, das gesamte Schema zu löschen und es später neu zu erstellen.
Gründe dafür:
quelle
An anderer Stelle im Web gefunden
quelle
Sie können eine Tabelle nicht abschneiden, wenn Sie die Einschränkungen nicht löschen. Eine Deaktivierung funktioniert auch nicht. Sie müssen alles fallen lassen. Ich habe ein Skript erstellt, das alle Einschränkungen löscht und dann neu erstellt.
Stellen Sie sicher, dass Sie es in eine Transaktion einwickeln;)
quelle
Die Antworten von @denver_citizen und @Peter Szanto haben bei mir nicht ganz funktioniert, aber ich habe sie geändert, um Folgendes zu berücksichtigen:
quelle
kürzen hat bei mir nicht funktioniert, löschen + reseed ist der beste Ausweg. Falls es einige von Ihnen gibt, die eine große Anzahl von Tabellen durchlaufen müssen, um Löschen + erneutes Einfügen durchzuführen, können Probleme mit einigen Tabellen auftreten, die keine Identitätsspalte haben. Der folgende Code überprüft, ob eine Identitätsspalte vorhanden ist, bevor Sie versuchen neu besäen
quelle
Ich habe die folgenden Methoden geschrieben und versucht, sie zu parametrisieren, damit Sie sie in einem
Query document
Or Make a nützlichSP
machen können .A) Löschen
Wenn Ihre Tabelle nicht über Millionen von Datensätzen verfügt, funktioniert dies gut und es gibt keine Änderungsbefehle :
B) Abschneiden
Wenn Ihre Tabelle Millionen von Datensätzen enthält oder Sie kein Problem mit dem Befehl Ändern in Ihren Codes haben, verwenden Sie diesen:
quelle
Es ist meine Lösung für dieses Problem. Ich habe es verwendet, um PK zu ändern, aber ich habe die gleiche Idee. Hoffe das wird nützlich sein)
quelle
Für
MS SQL
zumindest die neueren Versionen, können Sie einfach das Constraints mit Code wie folgt deaktivieren:quelle
Das Folgende funktioniert für mich auch mit FK-Einschränkungen und kombiniert die folgenden Antworten, um nur die angegebenen Tabellen zu löschen :
Hinweis:
Ich denke, es hilft immer noch, die Tabellen in der Reihenfolge zu deklarieren, in der sie gelöscht werden sollen (dh Abhängigkeiten zuerst töten). Wie in dieser Antwort zu sehen ist , können Sie anstelle von schleifenspezifischen Namen alle Tabellen durch ersetzen
quelle
DELETE
ist nicht dasselbe wieTRUNCATE
. Dadurch werden Ihre Transaktionsprotokolle gefüllt.Wenn keine dieser Antworten wie in meinem Fall funktioniert hat, gehen Sie wie folgt vor:
Viel Glück!
quelle
Löschen und dann das automatische Inkrement zurücksetzen:
dann
quelle
Die einzige Möglichkeit besteht darin, Fremdschlüssel vor dem Abschneiden zu löschen. Nach dem Abschneiden der Daten müssen Sie die Indizes neu erstellen.
Das folgende Skript generiert die erforderliche SQL zum Löschen aller Fremdschlüsseleinschränkungen.
Als Nächstes generiert das folgende Skript das erforderliche SQL zum erneuten Erstellen von Fremdschlüsseln.
Führen Sie das generierte Skript aus, um alle Fremdschlüssel zu löschen, Tabellen abzuschneiden, und führen Sie dann das generierte Skript aus, um alle Fremdschlüssel neu zu erstellen.
Die Anfragen werden von hier übernommen .
quelle
In SSMS hatte ich ein geöffnetes Diagramm mit dem Schlüssel. Nachdem ich den Schlüssel gelöscht und die Datei abgeschnitten hatte, konzentrierte ich mich auf das Diagramm und erstellte ein Update, indem ich ein Identitätsfeld löschte und dann wiederherstellte. Beim Speichern des Diagramms wurde ein Dialogfeld zum Speichern angezeigt. Anschließend wurde im Dialogfeld "Während Sie arbeiteten, wurden Änderungen an der Datenbank vorgenommen" durch Klicken auf "Ja" der Schlüssel wiederhergestellt und aus der gesperrten Kopie im Diagramm wiederhergestellt.
quelle
Wenn Sie dies in irgendeiner Häufigkeit tun, zum Teufel sogar nach einem Zeitplan, würde ich absolut niemals eine DML-Anweisung verwenden. Die Kosten für das Schreiben in das Transaktionsprotokoll sind einfach zu hoch und das Einstellen der gesamten Datenbank
SIMPLE
ist lächerlich Wiederherstellungsmodus zu versetzen, um eine Tabelle abzuschneiden.Der beste Weg ist leider der harte oder mühsame Weg. Das ist:
Mein Prozess dazu umfasst die folgenden Schritte:
Skripte dieser Art sollten innerhalb eines
begin tran
and-commit tran
Blocks erstellt werden.quelle
Ich habe festgestellt , dass nur Sie TRUNCATE Tabelle auf einer übergeordneten Tabelle mit Fremdschlüssel - Constraints auf ein Kind so lange verwenden können , wie Sie die Einschränkungen für die SPERREN Kind Tabelle zuerst. Z.B
Der Fremdschlüssel CONSTRAINT child_par_ref in der untergeordneten Tabelle verweist auf PARENT_TABLE
quelle
Der einfachste Weg:
1 - Geben Sie phpmyadmin ein.
2 - Klicken Sie auf den Tabellennamen in der linken Spalte.
3 - Klicken Sie auf Operation (oberes Menü).
4 - Klicken Sie auf "Tabelle leeren (TRUNCATE).
5 - Deaktivieren Sie das Kontrollkästchen" Fremdschlüsselprüfungen aktivieren ".
6 - Fertig !
Link zum Bild-Tutorial
Tutorial: http://www.imageno.com/wz6gv1wuqajrpic.html
(Entschuldigung, ich habe nicht genug Ruf, um Bilder hier hochzuladen: P)
quelle
Du könntest es versuchen
DELETE FROM <your table >;
.Der Server zeigt Ihnen den Namen der Einschränkung und die Tabelle an. Wenn Sie diese Tabelle löschen, können Sie löschen, was Sie benötigen.
quelle
referenz - Fremdschlüssel-Zwischentabelle abschneiden
Ich arbeite für mich in MYSQL
quelle