Wie verwende ich einen automatisch inkrementierten Primärschlüssel auch als Fremdschlüssel?
Das ist, was ich versuche zu tun:
Ich habe 2 Tische ...
CREATE TABLE `parent` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `child` (
`parent_id` int(11) DEFAULT NULL,
`related_ids` int(11) DEFAULT NULL,
KEY `parent_id` (`parent_id`),
KEY `related_ids` (`related_ids`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Und dann eine Einschränkung:
ALTER TABLE `parent` ADD FOREIGN KEY (`id`) REFERENCES `child` (`parent_id`);
Wie Sie sehen können, hat das übergeordnete Tabellenelement einen automatisch inkrementierten Primärschlüssel "id", der auch als Fremdschlüssel für die untergeordnete Tabelle verwendet wird.
Nun möchte ich einen Datensatz in die übergeordnete Tabelle einfügen:
INSERT INTO parent SET DATA="abc";
Und es schlägt fehl mit Fehler:
Kann keine untergeordnete Zeile hinzufügen oder aktualisieren: Eine Fremdschlüsseleinschränkung schlägt fehl anacorbero
.parent
, CONSTRAINTparent_ibfk_1
UNBEKANNTER SCHLÜSSEL id
) VERWEISEchild
(parent_id
))
Ich verstehe, dass dies fehlschlägt, da in der untergeordneten Tabelle kein Datensatz gefunden wird, auf den verwiesen wird. Wenn ich mit dem Erstellen eines Datensatzes in der untergeordneten Tabelle beginne, setze die parent_id auf 1 und setze dann den Zähler für die automatische Inkrementierung der übergeordneten Tabelle zurück (so dass die nächste Einfügung die ID 1 hat), funktioniert es! Aber das ist keine Lösung.
Ich sehe das Dienstprogramm der Einfügesperre nicht, wenn in der untergeordneten Tabelle keine verwandte Zeile vorhanden ist ...
Ich versuche nur, eine Eins-zu-Viele-Beziehung aufzubauen ...
(Ich weiß, dass ich JOIN verwenden kann, aber ich versuche, Tabellenbeziehungen für die Datenintegrität und auch als Metadaten für PHP zu verwenden.)