2010-12-14 5 views
0

http://dev.mysql.com/tech-resources/articles/hierarchical-data.html중첩 설정 SQL 문제

LOCK TABLE nested_category WRITE; 

SELECT @myLeft := lft FROM nested_category 

WHERE name = '2 WAY RADIOS'; 

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft; 
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft; 

INSERT INTO nested_category(name, lft, rgt) VALUES('FRS', @myLeft + 1, @myLeft + 2); 

UNLOCK TABLES; 

나는 $를 통해 CodeIgniter의에서이 샘플 코드 this-> DB-> 쿼리()를 실행 시도하지만이 오류

A Database Error Occurred 

Error Number: 1064 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LOCK TABLE nested_category WRITE; SELECT @myLeft := lft FROM nested_category WHERE name = '2 WAY RADIOS';' at line 3 

LOCK TABLE nested_category WRITE; SELECT @myLeft := lft FROM nested_category WHERE name = '2 WAY RADIOS'; UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft; UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft; INSERT INTO nested_category(name, lft, rgt) VALUES('FRS', @myLeft + 1, @myLeft + 2); UNLOCK TABLES; 

나는 확신을 얻을 수 phpMyAdmin에서이 SQL을 실행 한 이후로 데이터베이스가 문제가되지 않습니다. 그러나 via 코드를 실행하면 오류가 발생합니다. 이것은 codeigniter 문제가 될 수 있습니까? 파일 인코딩 문제? query() 함수는 한 번에 여러 쿼리를 지원합니까? 나는 곤두박질 친다.

답변

0

실제로는 그렇지 않습니다. MySQL의 대부분의 사용자 프론트 엔드는 입력 한 여러 SQL 쿼리를 분할하여 하나씩 보내므로주의하지 않았을 수 있습니다.

각 쿼리를 자체 query() 호출로 분할해야하며 동일한 MySQL 연결/세션에서 각 query()가 호출된다고 가정하면 예상대로 작동합니다.

MySQL 5.0 이상을 사용하는 경우 수동으로 테이블을 잠그거나 잠금 해제하지 않고 트랜잭션을 사용할 수 있습니다. LOCK TABLE nested_category WRITEBEGINUNLOCK TABLES으로 대체하면 COMMIT으로 바뀝니다.

+0

쿼리 통합 기능 (있는 경우)을 살펴 보겠습니다. 또한 거래에 관해서는 MyISAM을 사용하고 있으며 트랜잭션 지원을 위해 InnoDB를 사용해야한다고 생각합니다. – arvinsim

0

codeigniter에 대해 모르겠지만 PHP에서 이러한 쿼리를 수행 할 때 "mysqli"개체를 사용하고 함수를 사용하여 여러 쿼리를 수행 할 수 있습니다.

개인적으로, 나는 내 자신의 사용을 위해 약간의 기능을 썼다 :

// $queries should be an array of strings (individual queries). 
private function multi_query($queries) { 
    foreach ($queries as $i=>$q) { 
     $results[] = mysql_query($q, $this->con); 
    } 
    return $results; 
} 
쉽게 "BEGIN"쿼리를 앞에 추가하고 있다면 (배열에 "COMMIT"쿼리를 추가 작성할 수

MySQL 5.0 + 사용) 모든 쿼리가 순차적으로 실행되도록합니다.