MySQL 5.7.21中‘UNIQUE field(field)’语法报错原因及方案咨询
嘿,这个问题我之前也碰到过,是典型的SQL语法兼容性差异导致的,我给你拆解明白:
报错的根本原因:MySQL 5.7的语法解析更严格了
你的问题出在UNIQUE position (position)这个写法上。在MySQL 5.7之前(包括5.6和MariaDB),解析器对这种写法比较宽容——它会默认你是想给position列加唯一约束,把重复的position当成“无心之失”忽略掉。
但MySQL 5.7开始严格遵循SQL标准,它会把第一个position当成你要给这个唯一约束自定义的名称,然后后面的(position)就变成了无效语法,因为约束名称后面应该跟的是列定义或者索引选项,而不是重复的列括号,所以直接报了1064语法错误。
为啥其他数据库/旧版本能跑通?
- MariaDB:它从早期MySQL分支出来后,一直保留了对这种宽松语法的兼容,就是为了让老项目的SQL脚本不用修改就能直接运行。
- MySQL 5.6及更早版本:当时的解析器容错性更高,能“猜”到你的真实意图是给列加唯一约束,而不是定义一个同名约束。
- 其实像PostgreSQL这类严格遵循标准的数据库,本来就不允许这种写法,它们只认
UNIQUE (列名)或者CONSTRAINT 约束名 UNIQUE (列名)这两种标准写法。
你的解决方案完全正确!
改成UNIQUE (position)是标准且通用的写法,不仅能在MySQL 5.7+正常运行,在MariaDB、MySQL 5.6以及其他主流数据库里都没问题。
如果后续你需要更清晰地管理约束(比如以后要删除这个约束时),还可以显式指定约束名称,可读性更强:
CREATE TABLE testing ( pageid INT UNSIGNED NOT NULL AUTO_INCREMENT, position SMALLINT UNSIGNED NOT NULL, PRIMARY KEY (pageid), CONSTRAINT uc_testing_position UNIQUE (position) ) ENGINE=InnoDB CHARSET=utf8;
内容的提问来源于stack exchange,提问作者Avatar
相关产品推荐
相关产品推荐

