Як уникнути зарезервованих слів, що використовуються як назви стовпців? MySQL / Створити таблицю


139

Я генерую таблиці з класів у .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;

Відповіді:


184

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


5
IMHO, ви повинні завжди цитувати всі назви полів та назви таблиць.
rjmunro

10
@rjmunro - Це так дещо захисніше, оскільки захищає вас від нових зарезервованих ключових слів, що вводяться в пізніших версіях, але мені не подобається візуальне занепокоєння.
Мартін Сміт

Це ж виправлення (подвійна цитата, що потрібно вийти) працює і для ключових слів у CQL Кассандри. Я знаю, трохи поза темою, але ця тема виникла в пошуках, характерних для Кассандри.
Годфрі Герцог

Посилання на довідник MySQL наразі порушено. Фактичне посилання: dev.mysql.com/doc/refman/5.7/uk/keywords.html
Miha_x64

71

Вам слід використовувати символ зворотного галочки (`), наприклад:

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

Якщо вас цікавить портативність між різними серверами 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 та скидання режиму.


Це чудово! Я можу написати запит один раз і просто поставити комутатор для стеків MySQL!
ravemir
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.