Ich habe gut gesucht und keine Antwort Erläuterung des Problems gut finden. Hier ist ein vereinfachtes Beispiel für mein Problem. Sagen wir, ich test
mit zwei Feldern first
und second
einen Tisch haben. Ich mache first
den Primärschlüssel und will second
first
und Kaskade auf Update verweisen. Dadurch kann ich eine Liste von Zeilen erstellen, wobei ich weiß, welche Zeile nach einer bestimmten Zeile steht, außer dem "Kopf".Fremdschlüssel Referenzierung derselben Tabelle
Erstellen der Tabelle funktioniert gut, aber wenn ich versuche, eine Zeile hinzuzufügen, es beschwert sich, dass die Fremdschlüssel mit Cascading Update fehlgeschlagen. Dies macht Sinn, als ich second
als null verließ. Deshalb dachte ich, ich zwei Zeilen einfügen könnte und dann den Fremdschlüssel hinzufügen:
first: a second: b
first: b second: a
Dies war erfolgreich. Ich versuchte dann Zeile 1 zu aktualisieren, um einen first
Wert von c
zu haben. Dies funktionierte jedoch nicht, da der Fremdschlüssel fehlgeschlagen war. Warum? Sollte es nicht einfach folgendes werden?
first: c second: b
first: b second: c
Meine einzige Vermutung ist, die Existenz von Kreis Updates mit dem Update 1 Kaskadierung zu Zeile 2 Zeile, zurück Kaskadierung auf Reihe 1, aber dies geschieht nicht! Es gibt nichts, das auf second
verweist, also sollte das Update nur auf Zeile 2 kaskadieren und stoppen. Bitte hilf mir, das macht mich verrückt.
Edit: Wie gewünscht, hier ist mein show create table test
.
CREATE TABLE `test` (
`first` varchar(32) NOT NULL,
`second` varchar(32) NOT NULL,
PRIMARY KEY (`first`),
KEY `fk` (`second`),
CONSTRAINT `fk` FOREIGN KEY (`second`) REFERENCES `test` (`first`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Der Primärschlüssel ist nicht null, da es c für Zeile ein und b für Zeile zwei sein wird. Die referenzierende Spalte hat auch keinen Nullwert. Es wird b für die erste Zeile und c für die zweite Zeile sein. –
es wird nicht Nullwert aber haben? Bitte fügen Sie 'show create table test' hinzu, um die Struktur zu sehen. danke –
Definitiv, meine Frage mit den Ergebnissen bearbeitet. –