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; 

は私がます$ this-> DB->クエリ()を経由してCodeIgniterの中に、このサンプルコードを実行しようとしたが、私は確信している

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を実行していたので問題にはなりませんでした。しかし、私はビアコードで実行すると、私はエラーが発生します。これはコード署名の問題でしょうか?ファイルエンコーディングの問題? query()関数は複数のクエリを同時にサポートしていますか?私は困惑している。

答えて

0

実際、そうではありません。 MySQLのほとんどのユーザフロントエンドは、入力した複数のSQLクエリを分割して1つずつ送信するため、気付かないかもしれません。

それぞれのクエリを独自の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 +を使用します)。