2010-12-14 32 views
0

http://dev.mysql.com/tech-resources/articles/hierarchical-data.htmlNested Set problème SQL

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; 

J'ai essayé d'exécuter ce code d'exemple dans CodeIgniter via $ this-> db-> query() mais je reçois cette erreur

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; 

Je suis sûr que le base de données n'est pas le problème puisque j'ai couru ce SQL dans phpmyadmin et cela a fonctionné. Mais quand je cours au code, j'ai une erreur. Cela pourrait-il être un problème de codeigniter? Un problème d'encodage de fichier? La fonction query() prend-elle en charge plusieurs requêtes à la fois? Je suis perplexe.

Répondre

0

En fait ce n'est pas le cas. La plupart des interfaces utilisateur pour MySQL diviseront plusieurs requêtes SQL que vous avez saisies et les enverront une par une, donc vous ne l'aurez peut-être pas remarqué.

Vous devez diviser chaque requête en son propre appel query(), et cela fonctionnera comme prévu en supposant que chaque requête() est appelée sur la même connexion/session MySQL. Sur une autre note, si vous utilisez MySQL 5.0 ou supérieur, vous pouvez utiliser une transaction au lieu d'avoir à verrouiller/déverrouiller manuellement vos tables. Il suffit de remplacer LOCK TABLE nested_category WRITE par BEGIN et UNLOCK TABLES par COMMIT.

+0

Je vois que je vais regarder dans cette fonctionnalité de fractionnement de requête si elle existe. En ce qui concerne les transactions, j'utilise MyISAM et je crois que vous devez utiliser InnoDB pour supporter les transactions. – arvinsim

0

Je ne connais pas le codeigniter, mais lorsque je fais ces requêtes en php, vous pouvez utiliser un objet "mysqli" et effectuer plusieurs requêtes en utilisant la fonction mysqli_multi_query().

Personnellement, je l'ai écrit une petite fonction pour mon propre usage:

// $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; 
} 

Il était facile d'écrire une requête préfixer « BEGIN » requête et ajouter un « Commit » au tableau (si vous êtes en utilisant MySQL 5.0 +) qui s'assurera que toutes les requêtes sont exécutées séquentiellement.