Come posso evitare le parole riservate utilizzate come nomi di colonna? MySQL / Crea tabella


139

Sto generando tabelle dalle classi in .NET e un problema è che una classe può avere un nome campo keyche è una parola chiave MySQL riservata. Come posso evitarlo in un'istruzione create table? (Nota: l'altro problema di seguito è che il testo deve avere una dimensione fissa per essere indicizzato / univoco)

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;

Risposte:


184

È possibile utilizzare le virgolette doppie se la modalità ANSI SQL è abilitata

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; 

o il tick posteriore proprietario che fuoriesce altrimenti. (Dove trovare il `personaggio su vari layout di tastiera è trattato in questa risposta )

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; 

(Fonte: Manuale di riferimento MySQL, 9.3 Parole riservate )


5
IMHO dovresti sempre citare tutti i nomi dei campi e dei nomi delle tabelle.
rjmunro,

10
@rjmunro - Farlo è un po 'più difensivo in quanto ti protegge dalle nuove parole chiave riservate introdotte nelle versioni successive, ma non mi piace il disordine visivo.
Martin Smith,

La stessa correzione (doppia citazione per scappare) funziona anche per le parole chiave nel CQL di Cassandra. Un po 'fuori tema, lo so, ma questo thread è emerso in una ricerca specifica di Cassandra.
Godfrey Duke,

Il link al manuale di riferimento di MySQL è interrotto per ora. Link effettivo: dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64

71

Dovresti usare il segno di spunta indietro (`) ad es .:

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;

15

Se sei interessato alla portabilità tra server SQL diversi, devi utilizzare le query ANSI SQL. L'escaping delle stringhe in ANSI SQL viene eseguito utilizzando le virgolette doppie ("). Sfortunatamente, questo metodo di escape non è portabile su MySQL, a meno che non sia impostato in modalità di compatibilità ANSI.

Personalmente, avvio sempre il mio server MySQL con l'argomento --sql-mode = 'ANSI' poiché ciò consente entrambi i metodi di escape. Se stai scrivendo query che verranno eseguite in un server MySQL che non è stato configurato / è controllato da te, ecco cosa puoi fare:

  • Scrivi tutte le tue query SQL in ANSI SQL
  • Racchiudili nelle seguenti query specifiche di MySQL:

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

In questo modo le uniche query specifiche di MySQL sono all'inizio e alla fine del tuo script .sql. Se desideri spedirli per un altro server, rimuovi queste 3 query e sei pronto. Ancora più convenientemente è possibile creare uno script chiamato: script_mysql.sql che conterrebbe le query di impostazione della modalità sopra, generare uno script script_ansi.sql e ripristinare la modalità.


Questo è fantastico! Posso scrivere la query una volta e basta inserire un interruttore per gli stack MySQL!
ravemir,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.