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

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

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;

4 ответа

Вы можете использовать двойные кавычки, если включен режим 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 Зарезервированные слова)

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

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;

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

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

  • Напишите все ваши SQL-запросы в ANSI SQL
  • Включите их в следующие специфичные для MySQL запросы:

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

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

Для CosmosDB SQL вы можете использовать

      SELECT item["RESERVED_KEY"] FROM ...
Другие вопросы по тегам