如何转义用作列名的保留字?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;

Answers:


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
恕我直言,您应该始终引用所有字段名称和表名称。
rjmunro

10
@rjmunro-这样做更具防御性,因为它可以防止您在更高版本中引入新的保留关键字,但我不喜欢外观混乱。
马丁·史密斯

同样的解决方法(双引号转义)也适用于Cassandra的CQL中的关键字。我知道有些偏离主题,但是该线程在特定于Cassandra的搜索中浮出水面。
Godfrey Duke

MySQL参考手册链接目前已断开。实际链接:dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64

70

您应该使用反勾号(`),例如:

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中的字符串转义通过使用双引号(“)完成。不幸的是,除非将其转为ANSI兼容模式,否则此转义方法不可移植到MySQL。

就个人而言,我总是使用--sql-mode ='ANSI'参数启动MySQL服务器,因为这允许两种方法进行转义。如果您要编写将在未设置/不受您控制的MySQL服务器中执行的查询,则可以执行以下操作:

  • 用ANSI SQL编写所有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堆栈设置一个开关即可!
拉韦米尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.