Ich muss eine Tabelle mit hohem Verweis in einer SQL Server-Datenbank entfernen. Wie kann ich eine Liste aller Fremdschlüsseleinschränkungen erhalten, die ich entfernen muss, um die Tabelle zu löschen?
(SQL-Antworten sind dem Klicken in der GUI des Management Studios vorzuziehen.)
sql
sql-server
tsql
Chillitom
quelle
quelle
Antworten:
Ich bin mir nicht sicher, warum niemand vorgeschlagen hat, aber ich
sp_fkeys
frage Fremdschlüssel für eine bestimmte Tabelle ab:Sie können auch das Schema angeben:
Ohne Angabe des Schemas geben die Dokumente Folgendes an:
quelle
Ich würde die Funktion "Datenbankdiagramm" in SQL Server Management Studio verwenden, aber da Sie dies ausgeschlossen haben, hat dies in SQL Server 2008 für mich funktioniert (habe 2005 nicht).
Um eine Liste der verweisenden Tabellen- und Spaltennamen zu erhalten ...
Um Namen von Fremdschlüsseleinschränkungen zu erhalten
quelle
Dies gibt Ihnen:
Code unten:
quelle
order by
: KeyTableSchemaName, KeyTableName, KeyColumnName, FkTableSchemaName, FkTableName, FkName und f) Ändern Sie die Spaltenreihenfolge in: KeyTableSchemaName, KeyTableName, KeyColumnName, FkTableSchemaName, FkTableName, FkTableSchemaName, FkTableName Konventionen und d / e für die wahrscheinlichste Verwendung (Auflistung der FK-Abhängigen von aTable
).Versuche dies :
quelle
Sie sollten auch die Verweise auf andere Objekte beachten.
Wenn die Tabelle von anderen Tabellen stark referenziert wurde, wird sie wahrscheinlich auch von anderen Objekten wie Ansichten, gespeicherten Prozeduren, Funktionen und mehr stark referenziert.
Ich würde wirklich ein GUI-Tool wie das Dialogfeld "Abhängigkeiten anzeigen" in SSMS oder ein kostenloses Tool wie ApexSQL Search empfehlen da die Suche nach Abhängigkeiten in anderen Objekten fehleranfällig sein kann, wenn Sie dies nur mit SQL tun möchten.
Wenn SQL die einzige Option ist, können Sie dies versuchen.
quelle
Bei der ursprünglichen Frage wurde darum gebeten, eine Liste aller Fremdschlüssel in eine Tabelle mit hohem Verweis aufzunehmen, damit die Tabelle entfernt werden kann.
Diese kleine Abfrage gibt alle Befehle zum Löschen von Fremdschlüsseln zurück, die zum Ablegen aller Fremdschlüssel in einer bestimmten Tabelle erforderlich sind:
Beispielausgabe:
Lassen Sie die WHERE-Klausel weg, um die Drop-Befehle für alle Fremdschlüssel in der aktuellen Datenbank abzurufen.
quelle
Hier ist der SQL-Code, den ich verwenden würde.
Es ist nicht besonders klar, SQL, also schauen wir uns ein Beispiel an.
Angenommen, ich wollte die
Employees
Tabelle in der beliebtenNorthwind
Datenbank von Microsoft ablegen , aber SQL Server sagte mir, dass ein oder mehrere Fremdschlüssel mich daran hinderten.Der obige SQL-Befehl würde diese Ergebnisse zurückgeben ...
Es zeigt mir, dass es 3 Fremdschlüssel gibt, die auf die
Employees
Tabelle verweisen . Mit anderen Worten, ich darf diese Tabelle erst löschen (löschen), wenn diese drei Fremdschlüssel zum ersten Mal gelöscht werden.In den Ergebnissen wird in der ersten Zeile angegeben, wie die folgende Fremdschlüsseleinschränkung in den Ergebnissen angezeigt wird.
Die vorletzte Spalte zeigt den SQL-Befehl, den ich zum Löschen eines dieser Fremdschlüssel verwenden müsste , z.
... und die rechte Spalte zeigt die SQL zum Erstellen ...
Mit all diesen Befehlen haben Sie alles, was Sie zum Löschen der relevanten Fremdschlüssel benötigen, damit Sie eine Tabelle löschen und später neu erstellen können.
Puh. Hoffe das hilft.
quelle
quelle
Am einfachsten ist es, sys.foreign_keys_columns in SQL zu verwenden. Hier enthält die Tabelle die Objekt-IDs aller Fremdschlüssel für ihre referenzierte Spalten-ID. Referenzierte Tabellen-ID sowie die referenzierenden Spalten und Tabellen. Da die IDs konstant bleiben, ist das Ergebnis für weitere Änderungen im Schema sowie in den Tabellen zuverlässig.
Abfrage:
Wir können auch Filter hinzufügen, indem wir 'where' verwenden.
quelle
quelle
Ich verwende dieses Skript, um alle Details zum Fremdschlüssel zu finden. Ich benutze INFORMATION.SCHEMA. Unten ist ein SQL-Skript:
quelle
Zuerst
Verwenden Sie dann NimbleText , um mit Ihren Ergebnissen zu spielen
quelle
Einige gute Antworten oben. Aber ich möchte die Antwort lieber mit einer Frage haben. Dieser Code stammt aus sys.sp_helpconstraint (sys proc)
Auf diese Weise sucht Microsoft nach Fremdschlüsseln, die dem tbl zugeordnet sind.
Die Antwort sieht folgendermaßen aus: test_db_name.dbo.Account: FK_Account_Customer
quelle
select db_name() + '.' + schema_name(ObjectProperty(parent_object_id,'schemaid')) + '.' + object_name(parent_object_id) + ': ' + object_name(object_id) AS "FK Reference" from sys.foreign_keys where referenced_object_id = object_id('Customer')
Wenn Sie die Fremdschlüsselbeziehung aller Tabellen erhalten möchten, schließen Sie die
where
Klausel aus. Andernfalls schreiben Sie Ihren Tabellennamen anstelle vontablename
quelle
Dies zeigt die Beziehung nur an, wenn es sich um Fremdschlüsseleinschränkungen handelt. Meine Datenbank ist anscheinend älter als die FK-Einschränkung. Einige Tabellen verwenden Trigger, um die referenzielle Integrität zu erzwingen, und manchmal gibt es nur eine ähnlich benannte Spalte, um die Beziehung anzuzeigen (und überhaupt keine referenzielle Integrität).
Glücklicherweise haben wir eine konsistente Namensszene, sodass ich folgende Referenztabellen und Ansichten finden kann:
Ich habe diese Auswahl als Grundlage für die Generierung eines Skripts verwendet, das genau das tut, was ich für die zugehörigen Tabellen tun muss.
quelle
Nach dem, was @Gishu getan hat, konnte ich das folgende SQL in SQL Server 2005 erstellen und verwenden
Welche Zeigt die Tabellen, Spalten und Fremdschlüsselnamen in einer Abfrage an.
quelle
Bestimmen Sie Primärschlüssel und eindeutige Schlüssel für alle Tabellen in einer Datenbank ...
Dies sollte alle Einschränkungen auflisten und am Ende können Sie Ihre Filter setzen
Als Referenz lesen Sie bitte - http://blogs.msdn.com/b/sqltips/archive/2005/09/16/469136.aspx
quelle
Ich habe dies ab 2008 verwendet. Es ähnelt einigen anderen aufgelisteten Lösungen, aber die Feldnamen sind für Groß- und Kleinschreibung (LatBin) richtig sortiert. Darüber hinaus können Sie ihm einen einzelnen Tabellennamen geben und nur die Informationen für diese Tabelle abrufen.
quelle
Hier erfahren Sie, wie Sie alle Verantwortlichkeiten für die ausgewählte ID zählen. Ändern Sie einfach den Wert von @dbTableName, den Wert von @dbRowId und seinen Typ (wenn int '' in Zeile Nr. 82 entfernen muss (..SET @SQL = ..)). Genießen.
quelle
MySQL-Server hat
information_schema.REFERENTIAL_CONSTRAINTS
Tabelle FYI, Sie können es nach Tabellenname oder referenzierten Tabellennamen filtern.quelle
Liste aller Fremdschlüssel, die auf eine bestimmte Tabelle in SQL Server verweisen:
Sie können den Namen der referenzierenden Tabelle und den Spaltennamen durch folgende Abfrage erhalten ...
Und folgender Screenshot zum besseren Verständnis ...
quelle
Dadurch werden alle Fremdschlüssel abgerufen, die die ausgewählte Tabelle betreffen. * Nimmt ein _FIRSTABLENAME_SECONDTABLENAME-Format an.
Dies ist eine allgemeinere Form:
quelle
Die folgende Lösung funktioniert für mich:
quelle
Sie können durch folgende Abfrage finden:
quelle
Probiere auch.
Mit können
sp_fkeys
Sie das Ergebnis nicht nur nach dem Namen und dem Schema der pk-Tabelle, sondern auch nach dem Namen und dem Schema der fk-Tabelle filtern. Verknüpfungquelle
Am meisten bevorzugte Antwort von @BankZ
zusätzlich für verschiedene schemata
quelle