ich habe folgende 2 Tabellen:
Code: Select all
CREATE TABLE `parent` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE `child` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`parentID` int(10) NOT NULL,
PRIMARY KEY (`id`),
KEY `parentID` (`parentID`),
CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parentID`) REFERENCES `parent` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
Per Script werden jetzt beide Tabellen befüllt:
Code: Select all
$mysql->query("START TRANSACTION");
foreach($names as $name) {
// Abfrage, ob ein Gewünschter Name "$name" in Tabelle parent vorhanden ist.
// Wenn vorhanden ID in variable speichern.
// Wenn nicht vorhanden, INSERT in Tabelle parent, zurückgegebene ID in Variable speichern.
// INSERT in Tabelle child mit der eben gespeicherten ID.
}
// Wenn Fehler
$mysql->query("ROLLBACK");
// Wenn OK
$mysql->query("COMMIT");
Im ersten Schleifendurchlauf wird $name in der Tabelle parent gefunden und die ID ausgelesen, in allen anderen Fällen ist dieser nicht vorhanden und wird daher eingefügt. Die IDs hab ich zur Kontrolle ausgegeben und sind alle korrekt, aufsteigend. Es läuft kein anderes Script nebenher.
Beim INSERT in Tabelle child bekomme ich ab dem 2. Durchlauf aber immer folgende Meldung:
Wenn ich unmittelbar nach dem INSERT ein SELECT mache, kann ich die Zeile mit der ID auch nicht finden, obwohl das innerhalb der Transaktion ja möglich sein sollte. Oder irre ich mich?ErrNo: 1452
Error: Cannot add or update a child row: a foreign key constraint fails (`testdb`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parentID`) REFERENCES `parent` (`id`))