2017-09-06 3 views
0

Ich habe 5 Tabellen (A, B, C, D, E) in meinem Projekt.LAST_INSERT_ID() wird geändert, während Fremdschlüssel verwendet wird

Eine Tabelle hat PK sysNum, die int (255) NOT NULL AUTO_INCREMENT ist.

B hat PK-Blattnummer, die int (255) ist NOT NULL AUTO_INCREMENT, und B hat FK sysNum REFERENZEN A ON DELETE CASCADE AUF UPDATE CASCADE.

C und D haben dasselbe FK-BlattNum REFERENZEN B ON DELETE CASCADE AUF UPDATE CASCADE.

E hat FK sysNum REFERENZEN A ON DELETE CASCADE AUF UPDATE CASCADE.

ich viele Daten in diese Tabellen eingefügt werden hava, so chosed i transaction.Here ist mein PHP-Code:

$conn->beginTransaction(); 
    ...... 
     $query="insert into A() VALUES();"; 
     $stmt=$conn->query($query); 
     $stmt->closeCursor(); 

     $query="insert into B (...,sysNum) VALUES(...,LAST_INSERT_ID()); 
     insert into C (...,sheetNum) VALUES(...,LAST_INSERT_ID());     
     insert into D (...,sheetNum) VALUES(...,LAST_INSERT_ID());"; 
     $stmt=$conn->query($query); 
     $stmt->closeCursor(); 

     for($i=5;$i<$eRN;$i++) 
    { 
     ...... 
     $query="insert into C (...,sheetNum) VALUES (...,LAST_INSERT_ID());"; 
     $stmt=$conn->query($query); 
     $stmt->closeCursor();  
    } 

    for($i=1;$i<$dRN;$i++) 
    { 
     ...... 
     $query="insert into D (...,sheetNum) VALUES (...,LAST_INSERT_ID());"; 
     $stmt=$conn->query($query); 
     $stmt->closeCursor();  
    } 
    ... 
    $query="insert into E (sysNum,...) VALUES (LAST_INSERT_ID(),...);"; 
    $stmt=$conn->query($query); 
    $stmt->closeCursor();  

    $query="insert into E (sysNum,...) values (LAST_INSERT_ID(),...);"; 
    $stmt=$conn->query($query); 
    $stmt->closeCursor(); 
    $conn->commit(); 

Nach Einsatz in A, die sysNum von auto_increment erstellt ist 20. Und nach Einsatz in B , die BlattNum ist 10 wie die gleiche Weise von A. So SheetNum von C und D sind beide 10. Aber die sysNum von E ist 10, nicht 20.

Hinweis: diese 5 Tabellen funktionieren gut, bevor ich Spalte hinzugefügt zu A. Ich habe foreign_key_checks = 0 gesetzt und eine neue Spalte zu A hinzugefügt. Und dann foreign_key_checks = 1 zurück gesetzt, aber leider funktionieren E-Tabellen nicht.

Ich habe keine Ahnung, Wer kann mir helfen?

Antwort

2

Wenn LAST_INSERT_ID() verwendet diese Weise werden Sie immer den Wert aus der neuesten SQL-Anweisung erhalten, die sie von Einfügen in B. Ihren Schlüssel ist
Ich denke, was Sie wollen, dass die letzte SQL-Anweisung ist die haben Wert aus einer früheren Aussage. Sie würden besser sein, diesen Wert zu speichern, wenn Sie den Einsatz von A. getan haben Sie (für PDO) können

$query="insert into A() VALUES();"; 
$stmt=$conn->query($query); 
$id = Sconn->lastInsertId(); 

Für Mysqli ...

$query="insert into A() VALUES();"; 
$stmt=$conn->query($query); 
$id = Sconn->insert_id; 

Und dann diesen Wert für Ihr Einfügen in Tabelle E.

+0

Ich habe versucht $ id = $ conn-> insert_id; Einfügen in E (sysNum, ...) Werte ($ id, ...); aber $ id ist null – stack

+0

Hast du das gleich nach deinem Einfügen in die Tabelle A gelegt? Aktualisierte Antwort mit Position sollte es gestellt werden. –

+0

Für PDO - Sie müssen 'lastInsertId()' statt –

Verwandte Themen