Как избежать зарезервированных слов, используемых в качестве имен столбцов? MySQL/Создать таблицу

Я генерирую таблицы из классов в .NET, и одна проблема заключается в том, что класс может иметь имя поля key, которое является зарезервированным ключевым словом MySQL. Как избежать этого в инструкции create table? (Примечание: другая проблема ниже - текст должен быть фиксированным размером для индексирования/уникальным)

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;

Ответ 1

Вы можете использовать двойные кавычки, если включен режим ANSI SQL

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; 

или проприетарный обратный тик в противном случае. (Где найти символ ` на разных раскладках клавиатуры в этом ответе)

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; 

(Источник: Справочное руководство по MySQL, 9.3 Зарезервированные слова)

Ответ 2

Вы должны использовать символ обратного тика (`), например:

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;

Ответ 3

Если вы заинтересованы в переносимости между различными SQL-серверами, вы должны использовать запросы ANSI SQL. Экранирование строк в ANSI SQL выполняется с использованием двойных кавычек ("). К сожалению, этот метод экранирования не переносится в MySQL, если он не установлен в режиме совместимости с ANSI.

Лично я всегда запускаю свой MySQL-сервер с аргументом -sql-mode = 'ANSI', так как это позволяет использовать оба метода для экранирования. Если вы пишете запросы, которые будут выполняться на сервере MySQL, который не был настроен/контролируется вами, вот что вы можете сделать:

  • Напишите все ваши SQL-запросы в ANSI SQL
  • Закройте их в следующих MySQL конкретных запросах:

    SET @[email protected]@SQL_MODE;
    SET SESSION SQL_MODE='ANSI';
    -- ANSI SQL queries
    SET SESSION [email protected]_SQL_MODE;
    

Таким образом, единственные запросы, связанные с MySQL, - это начало и конец вашего .sql script. Если вы отправляете их на другой сервер, просто удалите эти 3 запроса, и все будет готово. Еще удобнее было бы создать script named: script_mysql.sql, который будет содержать вышеупомянутые запросы к настройкам режима, источник сценария script_ansi.sql script и reset.