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()函数是否一次支持多个查询?我很难过。
答案 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 +),这将确保所有查询都按顺序运行。