


So löschen Sie Zeilen aus einer Tabelle mit einem selbstreferenzierenden Fremdschlüssel
Um Zeilen in einer Tabelle mit selbstbezogenen Fremdschlüssel sicher zu löschen, müssen die Abhängigkeiten zuerst verarbeitet werden. Die folgenden drei Methoden können angewendet werden: 1. Wenn die Tabellenstruktur geändert werden kann, verwenden Sie bei Löschen der Kaskade beim Löschen der übergeordneten Zeile automatisch alle untergeordneten Zeilen. Achten Sie jedoch darauf, dass eine zufällige Löschung großer Datenmengen verhindern. 2. steuern Sie die Löschordnung manuell, löschen Sie zuerst die Blattknoten durch rekursives CTE und löschen Sie sie beispielsweise nach oben nach oben. Verwenden Sie beispielsweise die mit rekursive Klausel, um den angegebenen Knoten und alle Untergebenen zu lokalisieren und sie in Chargen zu löschen. 3. Deaktivieren Sie nur vorübergehend die Überprüfung der Fremdschlüssel in einer kontrollierten Umgebung (setzen Sie fremd_key_checks = 0) und können Sie nach dem Betrieb erneut anerkannt. Diese Methode hat jedoch ein hohes Risiko, was zu inkonsistenten Daten führen kann. Best Practice besteht darin, rekursives CTE zu kombinieren, um Unterbäume genau zu löschen oder die Kaskadierung der Löschung unter explizite Geschäftslogik zu aktivieren und Daten vor dem Betrieb für die Sicherheit immer zu sichern.
Durch das Löschen von Zeilen aus einer Tabelle, die einen selbstbezogenen Fremdschlüssel aufweist (dh ein Fremdschlüssel, der auf den Hauptschlüssel derselben Tabelle verweist), kann es aufgrund von Referenzintegritätsbeschränkungen schwierig sein. Wenn auf eine Zeile in derselben Tabelle auf eine andere Zeile verwiesen wird, erhalten Sie beim Versuch, sie zu löschen.

Hier erfahren Sie, wie Sie solche Zeilen sicher löschen:
1. Verstehen Sie die Struktur
Ein selbstbezogener Fremdschlüssel erscheint typischerweise in hierarchischen Daten, wie eine Mitarbeitertabelle, in der jeder Mitarbeiter einen Manager hat, und auf die ID von manager_id
verweist die id
eines anderen Mitarbeiter:

Tabelle Mitarbeiter erstellen ( Id int Primärschlüssel, Nennen Sie Varchar (100), Manager_id int, Fremd Key (Manager_ID) Referenzen Mitarbeiter (ID) );
In diesem Fall können Sie keine Zeile löschen - wenn jemand ein Manager ist ( id
in manager_id
), müssen Sie diese Abhängigkeiten zuerst verarbeiten.
2. In der richtigen Reihenfolge (Blattknoten zuerst) löschen
Der sicherste Ansatz besteht darin , untergeordnete Zeilen vor den Elternreihen zu löschen -dh die Blattknoten (die nicht von anderen verwiesen) zuerst zu entfernen und bis zu den obersten Knoten zu arbeiten.

Da Sie jedoch die Hierarchie nicht immer vorhersagen können, verwenden Sie eine rekursive oder iterative Strategie.
Option A: Verwenden Sie bei Löschen der Kaskade (wenn Sie das Schema steuern)
Ändern Sie den Fremdschlüssel, um abhängige Zeilen automatisch zu löschen:
TABLE -Mitarbeiter ändern Drop Fremd Key Employee_ibfk_1; - oder welcher Beschränkungsnamen auch immer TABLE -Mitarbeiter ändern Fügen Sie die Einschränkung FK_Manager hinzu Fremd Key (Manager_ID) Referenzen Mitarbeiter (ID) Bei Löschen der Kaskade;
Das Löschen einer Zeile löscht nun automatisch alle darunter liegenden Mitarbeiter (und deren Untergebene rekursiv).
Warnung : Dies kann große Teile Ihrer Daten unbeabsichtigt löschen. Verwendung mit Vorsicht.
Option B: In mehreren Schritten löschen (manuelle Steuerung)
Wenn Sie ON DELETE CASCADE
keine Zeilen in Stapeln löschen können oder nicht.
Schritt für Schritt:
Identifizieren Sie Zeilen, die nicht als Manager bezeichnet werden (zuerst sicher zu löschen):
Vom Mitarbeiter löschen Wo id nicht in ( Wählen Sie * aus (( Wählen Sie ein bestimmtes Manager_ID Vom Mitarbeiter Wobei Manager_id nicht null ist ) Als TMP );
HINWEIS: Der Double Wrapper (
tmp
) wird in MySQL benötigt, um Fehler über das Ändern derselben Tabelle in einer Unterabfrage zu vermeiden.Wiederholen Sie die Löschung, bis keine Zeilen mehr betroffen sind.
Dadurch werden Blattknoten allmählich entfernt und auf höhere Niveau-Knoten für das Löschen befestigt.
Alternativ löschen Sie einen bestimmten Unterbaum (z. B. alle unter einem bestimmten Manager):
Verwenden Sie einen rekursiven CTE (Common Table Expression), um alle Nachkommen zu finden:
Mit rekursiven Untergebenen als ( - Beginnen Sie mit dem Zielangestellten ID auswählen Vom Mitarbeiter Wobei ID = 123 - ID zu löschen (und alles darunter) Gewerkschaft alle - Fügen Sie rekursiv alle Mitarbeiter hinzu, die ihnen melden Wählen Sie E.Id Von Angestellter e Innere Join -Untergebene s auf e.Manager_id = S.Id ) Vom Mitarbeiter löschen Wobei ID in (ID aus Subordinaten auswählen);
Dadurch wird eine vollständige Hierarchie aus einem bestimmten Knoten sicher gelöscht.
3.. Deaktivieren Sie vorübergehend ausländische Schlüsselprüfungen (nicht für die Produktion empfohlen)
Als letztes Ausweg (z. B. während der Wartung) können Sie die Einschränkungsprüfung deaktivieren:
Setzen Sie fremd_key_checks = 0; Vom Mitarbeiter löschen, wobei ID = 123; Setzen Sie fremd_key_checks = 1;
⚠️ Gefährlich : Dies kann verwaiste Referenzen hinterlassen oder die Integrität der Daten brechen. Verwenden Sie nur in kontrollierten Umgebungen und nur dann, wenn Sie sich über den Datenzustand sicher sind.
Zusammenfassung
- Best Practice : Verwenden Sie rekursive CTEs, um ganze Unterbäume sicher zu löschen.
- Zur Automatisierung : Überlegen Sie sich
ON DELETE CASCADE
wenn das Datenmodell dies zulässt. - Vermeiden Sie : Deaktivieren von Fremdschlüsselprüfungen, es sei denn, dies ist unbedingt erforderlich.
Um mit Selbstreferenztabellen umzugehen, müssen Sie Sorgfalt erfordern-stützen Sie Ihre Daten immer vor der Löschung der Massen.
Grundsätzlich geht es darum, Abhängigkeiten zu verwalten: Kinder vor den Eltern zu löschen oder die Datenbank automatisch mit den Kaskadenregeln ausführen zu lassen.
Das obige ist der detaillierte Inhalt vonSo löschen Sie Zeilen aus einer Tabelle mit einem selbstreferenzierenden Fremdschlüssel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Warum brauche ich eine SSL/TLS -Verschlüsselungs -MySQL -Verbindung? Da unverschlüsselte Verbindungen dazu führen können, dass sensible Daten abgefangen werden, kann das Ermöglichen von SSL/TLS-Angriffen von Menschen in der Zwischenzeit verhindern und die Compliance-Anforderungen erfüllen. 2. Wie konfigurieren Sie SSL/TLS für MySQL? Sie müssen ein Zertifikat und einen privaten Schlüssel generieren, die Konfigurationsdatei ändern, um die SSL-CA-, SSL-Cert- und SSL-Key-Pfade anzugeben und den Dienst neu zu starten. 3. Wie kann man SSL erzwingen, wenn der Client eine Verbindung herstellt? Implementiert durch Angabe von Anforderungs- oder Anforderungsquellen bei der Erstellung eines Benutzers; 4. Details, die in der SSL -Konfiguration leicht übersehen werden, umfassen Zertifikatpfadberechtigungen, Probleme mit Zertifikatverlauf und Client -Konfigurationsanforderungen.

Um die MySQL -Bereitstellungsautomatisierung zu erreichen, besteht der Schlüssel darin, Terraform zu verwenden, um Ressourcen, Ansible Management -Konfiguration, Git für die Versionskontrolle und die Stärkung der Sicherheit und des Berechtigungsmanagements zu definieren. 1. Verwenden Sie Terraform, um MySQL -Instanzen wie Version, Typ, Zugriffskontrolle und andere Ressourcenattribute von AWSRDs zu definieren. 2. Verwenden Sie AnsiliblePlaybook, um detaillierte Konfigurationen wie Datenbankbenutzererstellung, Berechtigungseinstellungen usw. Zu realisieren; 3.. Alle Konfigurationsdateien sind in GIT -Management, Unterstützung Änderungsverfolgung und kollaborativer Entwicklung enthalten. 4. Vermeiden Sie hartcodierte sensible Informationen, verwenden Sie Vault oder AnsibleVault, um Kennwörter zu verwalten und die Zugriffskontrolle und die Mindestberechtigungsprinzipien festzulegen.

Methoden, die Excel -Pivot -Tabellenfunktionen implementieren, enthalten hauptsächlich die Verwendung von Fall oder wenn Anweisungen zum Kombinieren von Aggregatfunktionen für die Zeilenkonvertierung. 1. AnwendungsfallWenn zur Realisierung der statischen Umwandlung von Zeilen und Spalten für Situationen geeignet ist, in denen die Spaltenwerte bekanntermaßen konvertiert werden. Für verschiedene Werte werden neue Spalten generiert und Daten werden durch Summe zusammengefasst (Fallwhen ...). 2. Erzeugen Sie Spalten dynamisch, geeignet für Situationen, in denen bestimmte Werte ungewiss sind. Sie müssen einen eindeutigen Wert erhalten, bevor Sie einen Fallausdruck konstruieren. Normalerweise wird es mit gespeicherten Prozeduren oder Anwendungsschichtlogik kombiniert, um SQL -Zeichenfolgen zu spleißen und auszuführen. 3.. Verwenden Sie, ob Funktionen die Syntax vereinfachen, um den gleichen Effekt wie der Fall zu erzielen, aber die Schreibmethode ist kompakter. In tatsächlichen Anwendungen kann die Spalte, wenn die Dimension festgelegt ist, direkt codiert werden. Wenn sich die Dimension häufig ändert, wird empfohlen, Skripte zu verwenden oder zu speichern.

UsemysqlenterPriseAuditPluginifonenterPriseeditionByEnlingInConfigurationWithServer-ADIT = Force_plus_PermanentandCustomizeeVentsviaserver_audit_events;

MySQL muss für Finanzsysteme optimiert werden: 1. Finanzdaten müssen verwendet werden, um die Genauigkeit mit dem Dezimalart zu gewährleisten, und DateTime wird in Zeitfeldern verwendet, um Zeitzonenprobleme zu vermeiden. 2. Indexdesign sollte angemessen sein, häufig Aktualisierungen von Feldern zum Erstellen von Indizes vermeiden, Indizes in Abfragereihenfolge kombinieren und nutzlose Indizes regelmäßig reinigen. 3.. Verwenden Sie Transaktionen, um Konsistenz zu gewährleisten, Transaktionsgranularität zu kontrollieren, lange Transaktionen und in IT eingebettete Nicht-Kern-Operationen zu vermeiden und die entsprechenden Isolationsniveaus basierend auf dem Unternehmen auszuwählen. 4. Historische Daten nach Zeit partitionieren, Kaltdaten archivieren und komprimierte Tabellen verwenden, um die Abfrageeffizienz zu verbessern und den Speicher zu optimieren.

MySQL Master-Slave-Replikationsprobleme sind bei Verbindungsausnahmen, Datenkonsistenzen, GTID- oder Binlog-Fehlern und Replikationsverzögerungen üblich. 1. Überprüfen Sie, ob die Master-Slave-Verbindung normal ist, stellen Sie sicher, dass die Netzwerkverbindung, die Berechtigungspaare und die Kontokennwörter korrekt sind. 2. Fehlerbehebung bei Replikationsfehlern durch Inkonsistenzen in Daten, prüfen Fehlerprotokolle, überspringen Sie bei Bedarf Fehler und verwenden Sie Tools, um die Konsistenz zu überprüfen. 3. Behandeln Sie GTID- oder Binlog -Probleme, stellen Sie sicher, dass die Master -Bibliothek die erforderlichen Transaktionsprotokolle nicht gereinigt hat, und konfigurieren Sie den GTID -Modus korrekt. 4. Optimieren Sie die Replikationsverzögerung, verbessern Sie die Leistung der Slave -Bibliothek, aktivieren Sie die parallele Replikation und reduzieren Sie die Last der Slave -Bibliothek. Bei Problemen mit Problemen sollten Sie die Anzeige der Showlavestatus -Ausgabe priorisieren und die Grundursache des Protokollorts analysieren.

Der Schlüssel zur Wiederherstellung von MySQL Crash ist es, den Protokollierungsmechanismus zu verstehen und Vorsichtsmaßnahmen zu treffen. 1. Überprüfen Sie nach dem Absturz zuerst Fehlerlog und InnodBredolog, um die Ursache zu bestimmen. 2. In den meisten Fällen stellt MySQL nach dem Neustart automatisch die Datenkonsistenz durch die Wiederherstellungs- und Rückgänge wieder her. 3. Wenn logarithmisch, leichte Platz- oder Konfigurationsfehler vorhanden sind, müssen Sie manuell eingreifen. InnoDB_Force_Recovery kann verwendet werden, um Start- und Exportdaten zu erzwingen. 4.. Sie sollten regelmäßig sichern, die Ressourcenverbrauch überwachen, große Transaktionen vermeiden und Architekturen mit hoher verfügbarer Verfügbarkeit einsetzen, um die Schwierigkeit der Genesung zu verringern.

Tooptimizemysqlforreal-Time-Frauddetction, ConfiguresMartIndexing, choptionInnodbastorageEngine und TunesystemsettingsForHighThroughput.1) UseCompositeAnDcoveringIndexestospeedupFrequentqueries mit Säure-Indexing.2) SELECTINNODBFFFFFFFFFFFFFFFFFFREEDREGREWRECRECEDBFREWRECRECED-ACKE
