在MySQL中使用序列和nextval创建表时出现语法错误
MySQL创建带ID序列的users表的正确方法
为啥你的SQL报错?
你写的是PostgreSQL的序列语法,MySQL不认这套:
- 低版本MySQL(8.0之前)根本没有
CREATE SEQUENCE这个功能 - 就算是MySQL 8.0+,也不能直接把
NEXTVAL('序列名')设为列的默认值
方案一:用自增主键(最常用,推荐)
这是MySQL里实现自动ID的标准操作,简单省事:
CREATE TABLE users ( id INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, active BOOLEAN NOT NULL DEFAULT true, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
- 额外优化:给
updated_at加了ON UPDATE CURRENT_TIMESTAMP,更新记录时这个字段会自动刷新成当前时间,比固定值实用多了。
方案二:序列+触发器(仅MySQL 8.0+可用)
要是你非得用序列实现,那就得配合触发器来赋值:
- 先创建序列:
CREATE SEQUENCE users_id_seq START WITH 1 INCREMENT BY 1;
- 创建不带默认值的表:
CREATE TABLE users ( id INTEGER PRIMARY KEY NOT NULL, name VARCHAR(50) NOT NULL, active BOOLEAN NOT NULL DEFAULT true, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
- 创建触发器,插入数据时自动拿序列的下一个值:
DELIMITER // CREATE TRIGGER before_insert_users BEFORE INSERT ON users FOR EACH ROW BEGIN SET NEW.id = NEXTVAL(users_id_seq); END // DELIMITER ;
内容的提问来源于stack exchange,提问作者shaik azar
相关产品推荐
相关产品推荐

