2010-12-14 171 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; 

我試圖運行在笨通過$)此示例代碼這個 - > 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並且它工作正常。但是當我通過代碼運行時,出現錯誤。這可能是一個代碼錯誤?文件編碼問題? query()函數是否同時支持多個查詢?我很難過。

回答

0

其實事實並非如此。 MySQL的大多數用戶前端將分割您輸入的多個SQL查詢並逐個發送,因此您可能沒有注意到這一點。

,需要在每個查詢拆分成自己的查詢()調用,它會如預期假設每個查詢()調用同一個MySQL連接/會話。

在另一方面,如果你使用以上MySQL 5.0中,你可以使用,而不必手動鎖定/解鎖表的事務。只是BEGINUNLOCK TABLESCOMMIT取代LOCK TABLE nested_category WRITE

+0

我看,我會考慮這個查詢拆分功能,如果它的存在。關於事務,我正在使用MyISAM,我相信你需要使用InnoDB來支持事務。 – arvinsim 2010-12-15 01:05:46

0

我不知道codeigniter,但是當我在php中執行這些查詢時,可以使用「mysqli」對象並使用mysqli_multi_query()函數執行多個查詢。

就個人而言,我寫了一個小功能,爲我所用:

// $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」查詢,並附加「提交」查詢到的數組(如果你是使用MySQL 5.0 +),這將確保所有查詢順序運行。