2010-04-19 2 views
2

그래서 한 번에 몇 개의 삽입을 수행하려고합니다. 이는 서로에 대해 상호 의존적입니다. 내가 개 평가 웹 사이트를 운영한다고 가정 해 보겠습니다. 누구든지 내 데이터베이스에 개를 추가 할 수 있지만 그렇게함으로써 강아지의 예비 등급을 추가해야합니다. 나중에 다른 사람들이 개를 평가할 수 있습니다. 평가를받는 개는 다 대일 관계입니다 : 개는 여러 등급을가집니다.Codeigniter/mySQL 질문. 실제 삽입 전에 여러 삽입이 가능한지 확인

이것은 내 예비 환자에게 개를 평가하고 추가하기 때문에 평가를 받고 개의 기본 키에 외래 키를 설정해야합니다. 내가 아는 한, 이것은 실제로 내가 개를 추가 한 다음, 그 새 추가 키의 기본 키가 무엇인지 확인한 다음 삽입 전에 내 레이팅에 넣어야한다는 것을 의미합니다.

등급의 삽입물에 뭔가 잘못되었다고 생각해보십시오. 너무 길거나 내가 간과 한 것입니다. 평가가 실패하면 개는 이미 삽입되었지만 평가는 반영되지 않았습니다. 이 경우 개가 처음에는 추가되지 않았 으면합니다.

"등급이 떨어지면 개를 제거하십시오"라는 코드를 작성해야합니다. 그렇지 않으면 모든 것이 계획대로 진행될 때 키가 개가 될지 예측할 수있는 방법이 있습니다. "그 자리를 잡아라."라고 말할 수있는 방법이 있습니까? 그리고 모든 것이 작동하면 추가하십시오.

도움을 주시면 감사하겠습니다. 감사!!

답변

6

CodeIgniter는 트랜잭션을 사용하여이 프로세스를 단순화합니다.

http://codeigniter.com/user_guide/database/transactions.html

참고 :

MySQL의에서

, 당신은 이노 또는 BDB 테이블 유형보다는 보다 일반적인의 MyISAM을 실행해야합니다.

$this->db->trans_start(); 
$this->db->query('INSERT YOUR DOG'); 
$this->db->query('INSERT YOUR RATING'); 
$this->db->trans_complete(); 

if ($this->db->trans_status() === FALSE) 
{ 
    // Something went wrong, but nothing was committed to the database so you can handle the error here 
} 
else { 
    // Everything was added fine 
} 
+0

올바른 테이블 유형 (innoDb ... 등)이있는 경우에만 작동합니다. – SeanJA

+0

수정 된 답변으로이 지점을 분명하게 만듭니다. – Finbarr

+1

그래서 질문 : 이렇게하면 모델을 사용할 수 없습니까? 몇 가지 테이블에 인서트를 실행하고 있지만 모두 동일한 DB에 있습니다. $ dog_db = $ this-> load-> database ('dog', true)와 비슷한 것을 할 수 있습니까? $ dog_db-> trans_start(); if (! $ this-> dogs-> insert ($ dog)) $ dog_db-> trans_rollback(); else $ dog_db-> trans_commit(); – Ethan

3

land of transactions에 오신 것을 환영합니다! 거래가이 문제를 위해 특별히 고안되었으므로 숙박을 즐기실 것입니다.

START TRANSACTION; 
INSERT INTO dogs ...; 
INSERT INTO dog_ratings...; 
COMMIT; 

지금, 당신의 코드에서, 당신이 그 쿼리 사이에 물건의 모든 종류의 작업을 수행 할 수 있습니다, 그리고에서 트랜잭션을 종료 : :)

기본적으로, 이벤트의 순서는 MySQL로 다음과 같이 보일 것입니다 언제든지 SQL 쿼리 ROLLBACK을 사용하십시오. 그렇게하면 트랜잭션의 일부로 수행 된 u 리가 데이터베이스에 저장되지 않습니다. 당신은 CodeIgniter를 특정하게해야하지만, 기본적으로는 다음과 같이 보일 것이다 : $db 쿼리가 실패 할 때 DatabaseException 발생합니다 데이터베이스 래퍼 객체의 일종이라고 가정하면, 위의 코드에서

$db->query("START TRANSACTION"); 
try { 
    $db->query("INSERT INTO dogs..."); 
    //did that work? Sweet. Run the next one. You can fetch the insert id 
    //here too, if you want to use it in the next query. 
    $db->query("INSERT INTO dog_ratings..."); 
    $db->query("COMMIT"); 
} 
catch (DatabaseException $e) 
{ 
    $db->query("ROLLBACK"); 
    echo "Problem! ".$e->getMessage(); 
} 

을 , 트랜잭션 내부의 쿼리에 문제가 있으면 레코드가 생성되지 않습니다.

거래에 대해 배울 점이 많으므로 조금만 둘러보세요. 중요한 점은 MySQL을 사용하면 트랜잭션을 지원하기 위해 InnoDB 테이블을 사용해야한다는 것이다. MyISAM을 사용하고 있다면 START TRANSACTIONCOMMIT과 같은 명령이 실행되지만 아무것도하지 않습니다.

+0

BDB는 안전 – SeanJA

+0

muchas의 그라시아, zombat 거래입니다! – Ethan