Jak uniknąć słów zastrzeżonych używanych jako nazwy kolumn? MySQL / Utwórz tabelę

139

Generuję tabele z klas w .NET i jednym problemem jest to, że klasa może mieć nazwę pola, keyktóra jest zastrzeżonym słowem kluczowym MySQL. Jak uciec od tego w instrukcji tworzenia tabeli? (Uwaga: innym problemem poniżej jest to, że tekst musi mieć stały rozmiar, aby był indeksowany / unikalny)

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
źródło

Odpowiedzi:

184

Jeśli włączony jest tryb ANSI SQL, można używać cudzysłowów

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; 

lub zastrzeżony back tick uciekający w inny sposób. ( `W tej odpowiedzi omówiono, gdzie znaleźć znak na różnych układach klawiatury )

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; 

(Źródło: Podręcznik MySQL, 9.3 Słowa zastrzeżone )

Martin Smith
źródło
5
IMHO powinieneś zawsze cytować wszystkie nazwy pól i nazwy tabel.
rjmunro
10
@rjmunro - Robienie tego jest nieco bardziej defensywne, ponieważ chroni Cię przed nowymi zarezerwowanymi słowami kluczowymi, które zostaną wprowadzone w późniejszych wersjach, ale nie podoba mi się wizualny bałagan.
Martin Smith
Ta sama poprawka (podwójny cudzysłów do ucieczki) działa również dla słów kluczowych w CQL Cassandry. Wiem, że to trochę nie na temat, ale ten wątek pojawił się w wyszukiwaniu specyficznym dla Cassandry.
Godfrey Duke
Link do podręcznika MySQL jest na razie uszkodzony. Aktualny link: dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64
71

Powinieneś użyć znaku odwrotnego zaznaczenia (`), np .:

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;

źródło
15

Jeśli interesuje Cię przenośność między różnymi serwerami SQL, powinieneś użyć zapytań ANSI SQL. Unikanie znaków ucieczki w ANSI SQL odbywa się za pomocą podwójnych cudzysłowów ("). Niestety, ta metoda ucieczki nie jest przenoszona do MySQL, chyba że jest ustawiona w trybie zgodności ANSI.

Osobiście zawsze uruchamiam mój serwer MySQL z argumentem --sql-mode = 'ANSI', ponieważ pozwala to na obie metody ucieczki. Jeśli piszesz zapytania, które mają być wykonywane na serwerze MySQL, który nie został skonfigurowany / jest przez Ciebie kontrolowany, oto co możesz zrobić:

  • Pisz wszystkie zapytania SQL w języku ANSI SQL
  • Uwzględnij je w następujących zapytaniach specyficznych dla MySQL:

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

W ten sposób jedyne zapytania specyficzne dla MySQL znajdują się na początku i na końcu twojego skryptu .sql. Jeśli chcesz wysłać je na inny serwer, po prostu usuń te 3 zapytania i gotowe. Jeszcze wygodniej można by stworzyć skrypt o nazwie: script_mysql.sql, który zawierałby powyższe zapytania o ustawienie trybu, zresetować skrypt i zresetować tryb script_ansi.sql.

Charalampos Serenis
źródło
To jest świetne! Mogę raz napisać zapytanie i po prostu przełączyć na stosy MySQL!
ravemir