MySQL/Débogage

Un livre de Wikilivres.
Aller à : navigation, rechercher


Introduction[modifier | modifier le wikicode]

Comme vu précédemment, il peut être utile d'activer les logs sur l'historique des requêtes lors du débogage d'une application qui utilise MySQL.

Gestion des exceptions[modifier | modifier le wikicode]

En MySQL, les anomalies du type "division par zéro" ne renvoient pas d'erreur mais NULL.

Toutefois il est possible de lever des exceptions lors des manipulations de table, par exemple pour éviter qu'une liste d'insertions s'arrête au milieu à cause d'une contrainte d'unicité. L'exemple ci-dessous fonctionne sur une table InnoDB (et pas MyISAM)[1] :

ALTER TABLE `MaTable1` ADD UNIQUE(`id`);

INSERT INTO MaTable1 (id) VALUES('1');
START TRANSACTION;
      INSERT INTO MaTable1 (id) VALUES('2');
      INSERT INTO MaTable1 (id) VALUES('3');
      INSERT INTO MaTable1 (id) VALUES('1');
IF condition THEN
  COMMIT;
ELSE
  ROLLBACK;
END IF;

Ici une erreur surgit lors de la deuxième insertion d'un id=1. Selon une condition, on peut donc annuler les insertions de 2 et 3, ou bien les soumettre.

Erreurs[modifier | modifier le wikicode]

1130: Host 'example.com' is not allowed to connect to this MySQL server[modifier | modifier le wikicode]

Dans le cas d'une connexion depuis un PC distant, le compte utilisé n'est pas autorisé. Il faut donc le configurer avec :

GRANT ALL PRIVILEGES ON *.* TO 'utilisateur'@'%' WITH GRANT OPTION;

au lieu ou en plus de :

GRANT ALL PRIVILEGES ON *.* TO 'utilisateur'@'localhost' WITH GRANT OPTION;

1093 - You can't specify target table '...' for update in FROM clause[modifier | modifier le wikicode]

Cela se produit quand on essaie de mettre à jour ou supprimer des lignes selon une sélection de ces mêmes lignes.

Passer par des CREATE TEMPORARY TABLE (voire DECLARE si cela rentre dans une variable scalaire).

1553: Cannot drop index 'UNIQ_XXX': needed in a foreign key constraint[modifier | modifier le wikicode]

Il faut supprimer la clé étrangère avant l'index duquel elle dépend :

ALTER TABLE `maTable` DROP FOREIGN KEY `FK_XXX`;
ALTER TABLE `maTable` DROP INDEX `UNIQ_XXX`;

2003: Can't connect to MySQL server[modifier | modifier le wikicode]

Changer le paramètre "host".

A new statement was found, but no delimiter between it and the previous one[modifier | modifier le wikicode]

Ajouter un ";" ?

Cannot add foreign key constraint[modifier | modifier le wikicode]

Survient lors d'un "CREATE TABLE", et ce n'est pas lié à la valeur de foreign_key_checks.

Erreur : fonctionnalités relationnelles désactivées ![modifier | modifier le wikicode]

Se produit dans le concepteur de diagramme de phpMyAdmin, il faut l'activer dans config.inc.php.

Invalid use of group function[modifier | modifier le wikicode]

  • Dans le cas d'un SELECT, il conviendrait d'utiliser HAVING au lieu de WHERE pour modifier des enregistrements en fonction d'autres d'une sous-requête.
  • Pour un UPDATE ou un DELETE, les champs comparés par un IN ne sont peut-être pas du même type.

SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails[modifier | modifier le wikicode]

Il manque un "DROP FOREIGN KEY" avant un "DROP TABLE" ou un "DROP COLUMN". Pour voir la liste des clés étrangères :

SELECT * FROM information_schema.key_column_usage;

Pour les supprimer, l'utilisateur root n'a pas le droit de modifier directement directement la table "information_schema". Il faut donc exécuter les requêtes générées par la suivante :

SELECT concat('alter table ',table_schema,'.',table_name,' DROP FOREIGN KEY ',constraint_name,';')
FROM information_schema.table_constraints
WHERE constraint_type='FOREIGN KEY'
AND table_name='maTable';

SQLSTATE[42000]: Syntax error or access violation[modifier | modifier le wikicode]

Utiliser phpMyAdmin pour trouver l'erreur de syntaxe.

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'[modifier | modifier le wikicode]

Remplacer les "IN" par des jointures, ou la sous-requête par une deuxième dont le résultat est stockée dans une table temporaire.

Type d'énoncé non reconnu[modifier | modifier le wikicode]

Certains mots clés ne sont reconnus que dans les procédures stockées, ou doivent être précédés d'un SELECT.

Références[modifier | modifier le wikicode]