CreateTablePelatis.php脚本在不同MariaDB版本下运行失败的技术咨询
跨MariaDB版本创建表失败:SERIAL与AUTO_INCREMENT冲突问题解决
嘿,这个问题我碰到过!根源就在你SQL语句里的SERIAL和AUTO_INCREMENT同时使用了——这俩是不能搭在一起的。
为什么旧版本能跑,新版本报错?
在MariaDB/MySQL里,SERIAL其实是个语法糖,它本身就包含了AUTO_INCREMENT的属性(准确说,SERIAL等价于BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE)。你的旧版本MariaDB(10.1.19)语法检查比较宽松,容忍了这种重复声明的错误;但到了10.4.16版本,语法校验更严格了,直接把这个冲突当成错误抛出来了。
解决办法很简单,二选一就行:
方案1:保留SERIAL,去掉AUTO_INCREMENT
修改后的SQL语句:
CREATE TABLE pelatis ( pelatisKodikos SERIAL NOT NULL, pelatisEponymo VARCHAR(25) NOT NULL, pelatisOnoma VARCHAR(20) NOT NULL, pelatisAT VARCHAR(8) NOT NULL, pelatisDieythinsi VARCHAR(40) NULL, PRIMARY KEY (pelatisKodikos) ) ENGINE = InnoDB;
这个写法利用了SERIAL的自带属性,简洁而且兼容新旧版本。
方案2:替换SERIAL为显式的INT AUTO_INCREMENT
如果你觉得显式定义更直观,也可以把SERIAL换成普通的INT自增字段(如果业务不需要超大的ID范围的话):
CREATE TABLE pelatis ( pelatisKodikos INT NOT NULL AUTO_INCREMENT, pelatisEponymo VARCHAR(25) NOT NULL, pelatisOnoma VARCHAR(20) NOT NULL, pelatisAT VARCHAR(8) NOT NULL, pelatisDieythinsi VARCHAR(40) NULL, PRIMARY KEY (pelatisKodikos) ) ENGINE = InnoDB;
这个写法也能在两个版本里正常运行,而且更清晰地展示字段类型。
不管选哪个,修改后重新运行脚本就能解决问题啦~
内容的提问来源于stack exchange,提问作者Thanasis
相关产品推荐
相关产品推荐

