Ich habe ein Problem mit gegenseitigen Einschränkungen. Ich möchte zwei Tabellen haben, die jeweils eine Einschränkung für die andere haben.SQL-Problem, gegenseitige Einschränkungen, "eine Fremdschlüsseleinschränkung schlägt fehl"
Ich bin mit Doctrine2 arbeiten (aber es ist nicht mit dem Problem), hier ist meine vereinfachte Code:
SQL:
CREATE TABLE IF NOT EXISTS `thread` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`last_message_id` int(11) DEFAULT NULL,
`subject` varchar(255) NOT NULL
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQ_C023F2BBBA0E79C3` (`last_message_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `thread`
ADD CONSTRAINT `FK_C023F2BBBA0E79C3` FOREIGN KEY (`last_message_id`) REFERENCES `message` (`id`);
CREATE TABLE IF NOT EXISTS `message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`thread_id` int(11) DEFAULT NULL,
`body` longtext NOT NULL
PRIMARY KEY (`id`),
KEY `IDX_9E4E8B5FA76ED395` (`user_id`),
KEY `IDX_9E4E8B5FE2904019` (`thread_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `message`
ADD CONSTRAINT `FK_9E4E8B5FE2904019` FOREIGN KEY (`thread_id`) REFERENCES `thread` (`id`) ON DELETE CASCADE;
Doctrine2 Mapping (die den SQL-Code oben generiert):
<?php
class Thread
{
/* @ORM\OneToOne() */
private $lastMessage;
}
class Message
{
/* @ORM\ManyToOne() */
private $thread;
}
und wenn ich versuche, entweder einen Thread oder eine Nachricht zu löschen, erhalte ich (logisch) den Fehler: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails ('thread', CONSTRAINT 'FK_C023F2BBBA0E79C3' FOREIGN KEY ('last_message_id') REFERENCES 'message' ('id'))
Also, gibt es eine Möglichkeit, diesen Fehler zu vermeiden? Oder sollte ich gegenseitige Zwänge vergessen? Alles?
Ich möchte hinzufügen, dass ich die last_message_id behalten möchte, weil ich die Threads mit Infos zu ihrer letzten Nachricht anzeigen möchte, und eine (paginierte) Abfrage ohne diesen Verweis auf die letzte Nachricht zu erstellen war ein totaler Albtraum ...
Danke!
können Sie Ihre Tabelle Schema oder Diagramm, Code in diesem Fall ist nicht wirklich hilfreich. – Robert
Sie müssen den Wert 'lastMessage' in der Tabelle' thread' ändern, bevor Sie die aktuelle letzte Nachricht löschen. Wenn keine Nachrichten mehr vorhanden sind, d. H. Der Thread leer ist, sollte 'lastMessage' auf NULL gesetzt werden. – mellamokb
Ihr SQL-Code enthält nicht die 'FOREIGN KEY'-Einschränkungen (nicht, dass sie benötigt werden, das Problem ist klar, nur der Vollständigkeit halber). –