嵌套集SQL问题

时间:2010-12-14 09:04:26

标签: mysql codeigniter nested-sets

http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

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-> query()在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并且它有效。但是当我运行via代码时,我收到了一个错误。这可能是一个codeigniter问题吗?文件编码问题? query()函数是否一次支持多个查询?我很难过。

2 个答案:

答案 0 :(得分:0)

事实上它没有。 MySQL的大多数用户前端会将您输入的多个SQL查询拆分并逐个发送,因此您可能没有注意到这一点。

您需要将每个查询拆分为自己的query()调用,并且假设在同一个MySQL连接/会话上调用每个query(),它将按预期工作。

另外请注意,如果您使用的是MySQL 5.0或更高版本,则可以使用事务而不必手动锁定/解锁表。只需将LOCK TABLE nested_category WRITE替换为BEGIN,将UNLOCK TABLES替换为COMMIT

答案 1 :(得分: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”查询并向数组附加一个“COMMIT”查询(如果你使用的是MySQL 5.0 +),这将确保所有查询都按顺序运行。