嵌套集合SQL问题
问题描述:
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()函数是否同时支持多个查询?我很难过。
答
其实事实并非如此。 MySQL的大多数用户前端将分割您输入的多个SQL查询并逐个发送,因此您可能没有注意到这一点。
,需要在每个查询拆分成自己的查询()调用,它会如预期假设每个查询()调用同一个MySQL连接/会话。
在另一方面,如果你使用以上MySQL 5.0中,你可以使用,而不必手动锁定/解锁表的事务。只是BEGIN
和UNLOCK TABLES
与COMMIT
取代LOCK TABLE nested_category WRITE
。
答
我不知道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 +),这将确保所有查询顺序运行。
我看,我会考虑这个查询拆分功能,如果它的存在。关于事务,我正在使用MyISAM,我相信你需要使用InnoDB来支持事务。 – arvinsim 2010-12-15 01:05:46