Heim > Datenbank > MySQL-Tutorial > Warum kann ich eine übergeordnete Zeile aufgrund einer Verletzung der Fremdschlüsseleinschränkung nicht löschen?

Warum kann ich eine übergeordnete Zeile aufgrund einer Verletzung der Fremdschlüsseleinschränkung nicht löschen?

Susan Sarandon
Freigeben: 2025-01-14 16:21:44
Original
232 Leute haben es durchsucht

Why Can't I Delete a Parent Row Due to a Foreign Key Constraint Violation?

Verstoß gegen Fremdschlüsseleinschränkungen: Löschen oder Aktualisieren übergeordneter Zeilen

Der Versuch, einen Datensatz aus der jobs-Tabelle (der übergeordneten Tabelle) zu löschen, führt zu einem Fehler bei der Verletzung der Fremdschlüsseleinschränkung. Die Fehlermeldung verweist auf die Tabelle advertisers, insbesondere auf die Einschränkung advertisers_ibfk_1, die advertisers.advertiser_id mit jobs.advertiser_id verknüpft. Diese Abhängigkeit verhindert das Löschen oder Ändern der übergeordneten Zeile.

Die Ursache liegt im Datenbankschema:

<code class="language-sql">CREATE TABLE `advertisers` (
  `advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (`advertiser_id`),
  FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`)
);

CREATE TABLE `jobs` (
  `job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `advertiser_id` int(11) unsigned NOT NULL,
  ...
  PRIMARY KEY (`job_id`)
);</code>
Nach dem Login kopieren

Die Fremdschlüsseleinschränkung in der advertisers-Tabelle schreibt vor, dass jedes advertiser_id einen entsprechenden Eintrag in der jobs-Tabelle haben muss. Wenn ein Job (z. B. job_id = 1) mit einem Werbetreibenden (advertiser_id = 1) verknüpft ist, bleibt beim Löschen des Jobs das advertiser_id in der advertisers-Tabelle verwaist, wodurch die Einschränkung verletzt wird. Die Datenbank blockiert diese Aktion, um die Datenintegrität aufrechtzuerhalten.

Behebung des Einschränkungsverstoßes

Eine Problemumgehung besteht darin, Fremdschlüsselprüfungen vorübergehend zu deaktivieren:

<code class="language-sql">SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checks
DELETE FROM `jobs` WHERE `job_id` = 1 LIMIT 1;
SET FOREIGN_KEY_CHECKS = 1; -- Re-enable foreign key checks</code>
Nach dem Login kopieren

Dadurch wird die Durchsetzung von Einschränkungen umgangen und das Löschen ermöglicht. Entscheidend ist, dass die Überprüfungen anschließend wieder aktiviert werden, um die Datenbankintegrität wiederherzustellen. Dies ist jedoch eine vorübergehende Lösung. Ein robusterer Ansatz würde das Kaskadieren von Löschvorgängen (ON DELETE CASCADE) oder die ordnungsgemäße Verwaltung der zugehörigen Daten in der advertisers-Tabelle vor dem Löschen aus jobs umfassen.

Das obige ist der detaillierte Inhalt vonWarum kann ich eine übergeordnete Zeile aufgrund einer Verletzung der Fremdschlüsseleinschränkung nicht löschen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage