为什么MySQL表示法" UNIQUE字段(字段)"在MySQL 5.7.21中导致错误?

时间:2018-01-26 14:02:03

标签: mysql

今天我遇到了一个新问题,当时我处理的是一个mysql query,它适用于10.1.19-MariaDB localhost,但不适用于MySQL 5.7.21-0ubuntu0.16.04.1-log:

CREATE TABLE testing (
   pageid INT UNSIGNED NOT NULL AUTO_INCREMENT, 
   position SMALLINT UNSIGNED NOT NULL, 
   PRIMARY KEY (pageid), 
   UNIQUE position (position)
) ENGINE=InnoDB CHARSET=utf8

在MySQL 5.6中,它没有任何hickup(fiddle),但是,在MySQL 5.7.21(fiddle)中它会抛出:

  

1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在“位置(位置)附近使用正确的语法”)ENGINE = InnoDB CHARSET = utf8'在第1行

我通过将UNIQUE position (position)替换为UNIQUE (position)来找出解决方案。

但我想知道,底层问题是什么,为什么它与其他数据库系统一起工作,我不确定我的解决方案是否正确。

2 个答案:

答案 0 :(得分:2)

MySQL不允许您创建与列名称相同的索引

以下代码适用于MySQL(fiddle

CREATE TABLE testing (
   pageid INT UNSIGNED NOT NULL AUTO_INCREMENT, 
   position SMALLINT UNSIGNED NOT NULL, 
   PRIMARY KEY (pageid),
   UNIQUE idx_position (position)   
) ENGINE=InnoDB CHARSET=utf8

答案 1 :(得分:1)

这就是为什么在MySQL(及其派生词)的反引号中包含字段和表名非常重要的原因:

试试这个(相同的查询和索引名称,只添加反引号):

CREATE TABLE `testing` (
   `pageid` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
   `position` SMALLINT UNSIGNED NOT NULL, 
   PRIMARY KEY (`pageid`),
   UNIQUE `position` (`position`)
) ENGINE=InnoDB CHARSET=utf8;