2017-09-06 6 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 DELETE CASCADE를 참조하십시오.

C 및 D는 동일한 FK 시트를 갖는다. 참조 CASCADE ON DELETE CASCADE에 관한 설명은 생략한다.

E에는 FK sysNum이 있습니다. CASCADE ON DELETE CASCADE를 참조하십시오.

$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에 삽입 한 후 다음

I는 데이터 양이 표에 삽입 될 하바 그래서 transaction.Here을 chosed 나의 PHP 코드 , sheetNum은 A의 같은 방법으로 10입니다. 그래서 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 문에서 값을 얻을 것이다 가치. 당신은 당신이 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는 null입니다 – stack

+0

테이블 A에 삽입 한 직후에 이것을 넣었습니까? 배치해야 할 위치에 대한 답변을 업데이트했습니다. –

+0

PDO의 경우 A에 삽입 한 후'lastInsertId()'를 사용해야합니다. –