web-dev-qa-db-fra.com

Comment puis-je échapper aux mots réservés utilisés comme noms de colonne? MySQL / Créer une table

Je génère des tables à partir de classes dans .NET et un problème est qu'une classe peut avoir un nom de champ key qui est un mot clé réservé à MySQL. Comment puis-je y échapper dans une instruction create table? (Remarque: L'autre problème ci-dessous est que le texte doit avoir une taille fixe pour être indexé/unique)

create table if not exists misc_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
key TEXT UNIQUE NOT NULL,
value TEXT NOT NULL)ENGINE=INNODB;
132
user34537

Vous pouvez utiliser des guillemets si mode ANSI SQL est activé

CREATE TABLE IF NOT EXISTS misc_info
  (
     id    INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
     "key" TEXT UNIQUE NOT NULL,
     value TEXT NOT NULL
  )
ENGINE=INNODB; 

ou la tique arrière propriétaire s'échappant autrement. (Où trouver le ` caractère sur différentes dispositions de clavier est couvert dans cette réponse )

CREATE TABLE IF NOT EXISTS misc_info
  (
     id    INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
     `key` TEXT UNIQUE NOT NULL,
     value TEXT NOT NULL
  )
ENGINE=INNODB; 

(Source: Manuel de référence MySQL, 9.3 Mots réservés )

169
Martin Smith

Vous devez utiliser le caractère de tick arrière (`), par exemple:

create table if not exists misc_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
`key` TEXT UNIQUE NOT NULL,
value TEXT NOT NULL)ENGINE=INNODB;
69
Web Logic

Si la portabilité entre différents serveurs SQL vous intéresse, vous devez utiliser les requêtes SQL ANSI. L'échappement de chaîne dans ANSI SQL est effectué à l'aide de guillemets doubles ("). Malheureusement, cette méthode d'échappement n'est pas portable vers MySQL, sauf si elle est définie en mode de compatibilité ANSI.

Personnellement, je démarre toujours mon serveur MySQL avec l'argument --sql-mode = 'ANSI' car cela permet aux deux méthodes de s'échapper. Si vous écrivez des requêtes qui vont être exécutées sur un serveur MySQL non configuré/contrôlé par vous, voici ce que vous pouvez faire:

  • Écrivez toutes vos requêtes SQL en ANSI SQL
  • Incluez-les dans les requêtes spécifiques à MySQL suivantes:

    SET @OLD_SQL_MODE=@@SQL_MODE;
    SET SESSION SQL_MODE='ANSI';
    -- ANSI SQL queries
    SET SESSION SQL_MODE=@OLD_SQL_MODE;
    

Ainsi, les seules requêtes spécifiques à MySQL se trouvent au début et à la fin de votre script .sql. Si vous voulez les envoyer sur un autre serveur, supprimez simplement ces 3 requêtes et vous êtes prêt. Encore plus facilement, vous pouvez créer un script nommé: script_mysql.sql qui contiendrait les requêtes de définition de mode ci-dessus, sourcez un script script_ansi.sql et réinitialisez le mode.

15
Charalampos Serenis