Проблема вложенного множества SQL - PullRequest
0 голосов
/ 14 декабря 2010

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;

Я попытался запустить этот пример кода в codeigniter через $ this-> db-> query (), но я получаю эту ошибку

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;

Я уверен, что проблема не в базе данных, так как я запустил этот SQL в phpmyadmin, и он работал. Но когда я запускаю код, я получаю сообщение об ошибке. Может ли это быть проблемой codeigniter? Проблема с кодировкой файла? Поддерживает ли функция query () несколько запросов одновременно? Я в тупике.

Ответы [ 2 ]

0 голосов
/ 23 марта 2011

Я не знаю о 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+), который обеспечит последовательный запуск всех запросов.

0 голосов
/ 14 декабря 2010

На самом деле это не так. Большинство пользовательских интерфейсов для MySQL разделяют несколько введенных вами SQL-запросов и отправляют их один за другим, поэтому вы могли этого не заметить.

Вам нужно разделить каждый запрос на его собственный запрос query (), и он будет работать, как и ожидалось, при условии, что каждый запрос () вызывается в том же соединении / сеансе MySQL.

С другой стороны, если вы используете MySQL 5.0 или выше, вы можете использовать транзакцию вместо того, чтобы вручную блокировать / разблокировать ваши таблицы. Просто замените LOCK TABLE nested_category WRITE на BEGIN и UNLOCK TABLES на COMMIT.

...