【问题标题】:Nested Set SQL problem嵌套集 SQL 问题
【发布时间】:2010-12-14 09:04:25
【问题描述】:

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() 函数是否同时支持多个查询?我被难住了。

【问题讨论】:

    标签: mysql codeigniter nested-sets


    【解决方案1】:

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

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

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

    【讨论】:

    • 我明白了,如果存在该查询拆分功能,我将对其进行研究。另外关于事务,我正在使用 MyISAM,我相信您需要使用 InnoDB 来支持事务。
    【解决方案2】:

    我不了解 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 +),这将确保所有查询都按顺序运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多