2017-09-06 29 views
0

我的项目中有5个表(A,B,C,D,E)。在使用外键时更改LAST_INSERT_ID()

一个表有PK sysNum,它是int(255)NOT NULL AUTO_INCREMENT。

B有PK sheetNum,它是int(255)NOT NULL AUTO_INCREMENT,并且B有FK sysNum参考ON DELETE CASCADE ON UPDATE CASCADE。

C和D具有相同的FK sheetNum参考B在DELETE CASCADE上更新级联。

E has FK sysNum REFERENCES A ON DELETE CASCADE ON UPDATE CASCADE。

我哈瓦多的数据被插入到这些表中,所以我chosed transaction.Here是我的PHP代码:

$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的方法相同,因此C和D的sheetNum都是10.但是E的sysNum是10,而不是20.

注意:这5个表格工作正常,在添加列之前到A.我设置foreign_key_checks = 0,然后向A添加一个新列。然后设置foreign_key_checks = 1,但不幸的是E表失败。

我不知道,谁能帮我?

回答

2

使用LAST_INSERT_ID()这样,你总是会得到来自最新 SQL语句,该是你的钥匙从插入B.
我想你想要的是最后的SQL语句具有价值来自早期声明的价值。你会更好地存储这个值,当你做了A的插入可以使用(PDO)

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

对于mysqli的...

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

然后使用这个值你在表E插入。

+0

我试过$ id = $ conn-> insert_id;插入E(sysNum,...)值($ id,...);但是$ id是空的 – stack

+0

刚刚插入表A之后,您是否放置了这个?更新的答案应该放在它的位置上。 –

+0

对于PDO - 你需要在插入到A后使用'lastInsertId()'代替 –