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