0

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

4

2 回答 2

0

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

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

另一方面,如果您使用的是 MySQL 5.0 或更高版本,则可以使用事务,而不必手动锁定/解锁您的表。只需替换LOCK TABLE nested_category WRITEBEGIN和。UNLOCK TABLESCOMMIT

于 2010-12-14T17:32:56.180 回答
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 +),这将确保所有查询都按顺序运行。

于 2011-03-23T20:31:39.717 回答