今天我遇到了一个新问题,当时我处理的是一个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)
来找出解决方案。
但我想知道,底层问题是什么,为什么它与其他数据库系统一起工作,我不确定我的解决方案是否正确。
答案 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;