如何转义用作列名的保留字? MySQL/Create Table

中的类生成表。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;
195888 次浏览

你应该使用反勾字符(‘) ,例如:

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;

如果启用了 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保留字)

如果您对不同 SQL 服务器之间的可移植性感兴趣,那么应该使用 ANSI SQL 查询。ANSI SQL 中的字符串转义是通过使用双引号(“)完成的。遗憾的是,这种转义方法不能移植到 MySQL,除非将其设置为 ANSI 兼容模式。

就个人而言,我总是使用—— 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;
    

This way the only MySQL specific queries are at the beginning and the end of your .sql script. If you what to ship them for a different server just remove these 3 queries and you're all set. Even more conveniently you could create a script named: script_mysql.sql that would contain the above mode setting queries, source a script_ansi.sql script and reset the mode.

对于 CosmosDB SQL,您可能需要使用

SELECT item["RESERVED_KEY"] FROM ...