2017-09-06 3 views
0

私のプロジェクトには5つのテーブル(A、B、C、D、E)があります。外部キーを使用中にLAST_INSERT_ID()が変更されました

テーブルのPK sysNumは、int(255)NOT NULL AUTO_INCREMENTです。

Bには、int(255)NOT NULL AUTO_INCREMENTのPK sheetNumがあります。また、BにはFK sysNumがあります。CASCADE ON CASCADEのON DELETE CASCADEを参照してください。

CとDは、同じFKシートを持っています。参考文献CASCADE ON DELETE CASCADEにはありません。

EにはFK sysNumがあります。関連項目CASCADE ON DELETE CASCADEについて

I HAVA多くのデータがこれらのテーブルに挿入されるので、私はtransaction.Hereは私のPHPコードですchosed:Aに挿入した後

$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(); 

、AUTO_INCREMENTによって作成されたsysNumが20で、挿入後にBにsheetNumはAの同じ方法で10です。したがって、CとDのsheetNumは両方とも10です。ただし、EのsysNumは20でなく10です。

注:これらの5つのテーブルは、私はforeign_key_checks = 0を設定し、Aに新しい列を追加しました。そして、foreign_key_checks = 1を元に戻しましたが、残念ながらEテーブルは失敗します。

私はそれについて考えていない、誰が私を助けることができますか?

答えて

2

LAST_INSERT_ID()この方法を使用するときは、いつも私が何をしたいが持っている最後のSQL文のだと思いB.
への挿入からあなたの鍵をある最新 SQL文から値を取得します以前のステートメントからの値。あなたはあなたがmysqliのために

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

(PDO用)を使用することができますA.の挿入をやったとき...この値を格納する

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

方がよい。そして、この値を使用しますテーブルEに挿入してください。

+0

私は$ id = $ conn-> insert_idを試しました。 E(sysNum、...)の値($ id、...)に挿入します。 $ id is null – stack

+0

テーブルAに挿入した直後にこれを挿入しましたか?それが置かれるべき位置で答えが更新されました。 –

+0

PDOの場合、代わりに 'lastInsertId()'を使用する必要があります。 –

関連する問題