MySQL Fremdschlüssel auf sich selbst

M3Y3R

Well-known member
ID: 336361
L
8 Mai 2006
1.608
60
Hallo zusammen,

ich habe mir in phpMyAdmin eine Tabelle angelegt um Kommentare zu News zu speichern:
Code:
CREATE TABLE `comments` (
  `id` int(11) NOT NULL,
  `user_id` int(10) NOT NULL,
  `news_id` int(10) NOT NULL,
  `comment_id` int(10) NOT NULL DEFAULT '0',
  `comment` longtext NOT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


ALTER TABLE `comments`
  ADD PRIMARY KEY (`id`),
  ADD KEY `news_id` (`news_id`),
  ADD KEY `comment_id` (`comment_id`) USING BTREE;


ALTER TABLE `comments`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

ALTER TABLE `comments`
  ADD CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`news_id`) REFERENCES `news` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION,
  ADD CONSTRAINT `comments_ibfk_2` FOREIGN KEY (`comment_id`) REFERENCES `comments` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;

Die Spalten "user_id" und "news_id" sind Fremdschlüssel aus anderen Tabellen. Die Spalte "comment_id" sollte jedoch ein Fremdschlüssel aus der eigenen Tabelle sein. Angelegt wurde der Fremdschlüssel mit "ON DELETE CASCADE ON UPDATE NO ACTION", damit beim Löschen des Hauptkommentars, alles darunter ebenfalls gelöscht wird, beim Update jedoch nichts passiert.

Wenn ich nun einen neuen Eintrag anlegen möchte, erscheint folgende Meldung:
Code:
#1452 - Kann Kind-Zeile nicht hinzufügen oder aktualisieren: eine Fremdschlüsselbedingung schlägt fehl (`comments`, CONSTRAINT `comments_ibfk_2` FOREIGN KEY (`comment_id`) REFERENCES `comments` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION)

Hat jemand eine Idee warum und wie ich es hin bekomme, dass der Fremdschlüssel auf die eigene Tabelle zeigen kann?


Viele Grüße
M3Y3R
 
Kann es sein, dass die Tabelle noch Einträge in der Spalte comment_id enthält, die auf nicht mehr vorhandene Einträge zeigen?

[edit]

Oh, ich sehe grad erst, dass die Spalte ja Default 0 hat. Ich würde das so umstellen, dass dort NULL erlaubt ist und für alle Einträge, die keinen Elternkommentar haben, muss dort NULL eingetragen sein. Dann sollte das mit der Fremdschlüsselbeziehung auch klappen. Aktuell verwaist die Beziehung zum Teil auf ungültige Einträge und schlägt daher fehl.
 
Die Tabelle ist frisch angelegt. Ich probiere das aber mal mit NULL an Stelle von 0.
Kann ja durchaus sein dass versucht wird auf 0 zu referenzieren, die es aber ja nicht gibt...
 
Oh, ich sehe grad erst, dass die Spalte ja Default 0 hat. Ich würde das so umstellen, dass dort NULL erlaubt ist und für alle Einträge, die keinen Elternkommentar haben, muss dort NULL eingetragen sein. Dann sollte das mit der Fremdschlüsselbeziehung auch klappen. Aktuell verwaist die Beziehung zum Teil auf ungültige Einträge und schlägt daher fehl.

Genau das war das Problem ;)
Leider scheint CakePHP mit solchen Beziehungen nicht zurecht zu kommen :(
Also nix mit Fremdschlüssel auf eigene Tabelle...