Comment échapper aux mots réservés utilisés comme noms de colonnes? MySQL / Créer une table

139

Je génère des tables à partir de classes en .NET et un problème est qu'une classe peut avoir un nom de champ keyqui est un mot clé MySQL réservé. Comment puis-je l'é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;
Jonathan Leffler
la source

Réponses:

184

Vous pouvez utiliser des guillemets doubles si le 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 )

Martin Smith
la source
5
À mon humble avis, vous devez toujours citer tous les noms de champ et les noms de table.
rjmunro du
10
@rjmunro - Cela est un peu plus défensif car cela vous protège contre l'introduction de nouveaux mots clés réservés dans les versions ultérieures, mais je n'aime pas l'encombrement visuel.
Martin Smith
Le même correctif (guillemet double pour échapper) fonctionne également pour les mots-clés dans le CQL de Cassandra. Un peu hors sujet, je sais, mais ce fil est apparu dans une recherche spécifique à Cassandra.
Godfrey Duke
Le lien du manuel de référence MySQL est interrompu pour le moment. Lien réel: dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64
71

Vous devez utiliser le caractère de coche 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;

la source
15

Si vous êtes intéressé par la portabilité entre différents serveurs SQL, vous devez utiliser les requêtes ANSI SQL. L'échappement de chaîne dans ANSI SQL se fait en utilisant des guillemets doubles ("). Malheureusement, cette méthode d'échappement n'est pas portable sur 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 qui n'a pas été 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;

De cette façon, les seules requêtes spécifiques à MySQL se trouvent au début et à la fin de votre script .sql. Si vous voulez les expédier pour un serveur différent, supprimez simplement ces 3 requêtes et vous êtes prêt. Encore plus commodément, vous pouvez créer un script nommé: script_mysql.sql qui contiendrait les requêtes de réglage de mode ci-dessus, créer un script script_ansi.sql et réinitialiser le mode.

Charalampos Serenis
la source
C'est bien! Je peux écrire la requête une fois et simplement mettre un commutateur pour les piles MySQL!
ravemir