在 MySQL 中使用 sequelize 自动递增 id

Posted

技术标签:

【中文标题】在 MySQL 中使用 sequelize 自动递增 id【英文标题】:Auto increment id with sequelize in MySQL 【发布时间】:2016-02-19 21:35:49 【问题描述】:

我在 NodeJS 中有以下模型,带有 sequelize 和 mysql 数据库:

var Sequelize = require('sequelize');
var User = sequelize.define('user',         
        id: 
            type: Sequelize.INTEGER,
            autoIncrement: true,
            primaryKey: true
        ,
        ...
;

我正在尝试使用以下代码将新用户添加到我的数据库中:

sequelize.transaction().then(function(t) 
        User.create(/* User data without id */, 
            transaction: t
        ).then(function() 
            t.commit();
        ).catch(function(error) 
            t.rollback();
        );
    );

之后,我收到下一个错误:

Executing (47f19f7b-a02d-4d72-ba7e-d5045520fffb): START TRANSACTION;
Executing (47f19f7b-a02d-4d72-ba7e-d5045520fffb): SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Executing (47f19f7b-a02d-4d72-ba7e-d5045520fffb): SET autocommit = 1;
Executing (47f19f7b-a02d-4d72-ba7e-d5045520fffb): INSERT INTO `user` (`id`, /* next fields */) VALUES (DEFAULT, /* next values */);
Executing (47f19f7b-a02d-4d72-ba7e-d5045520fffb): ROLLBACK;

还有错误信息:

[SequelizeDatabaseError: ER_NO_DEFAULT_FOR_FIELD: Field 'id' doesn't have a default value]
  name: 'SequelizeDatabaseError',
  message: 'ER_NO_DEFAULT_FOR_FIELD: Field \'id\' doesn\'t have a default value'

但是,如果我手动设置 id 值,它就可以工作。 sequelize 似乎试图在 id 字段中设置默认值,而不是设置自动增量整数。我也在我的数据库中将此字段定义为 autoIncrement。

我怎么能做这个插入?我必须手动设置 id 吗?

编辑

这是我的表定义:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` varchar(9) NOT NULL,
  `name` varchar(20) NOT NULL,
  `email` varchar(30) DEFAULT NULL,
  `birthdate` date NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid_UNIQUE` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

【问题讨论】:

@Genzotto 即使我也面临同样的问题,但我不明白你为什么给主键(自动增量)的初始值?你是怎么做到的? ***.com/questions/4678110/… 【参考方案1】:

您必须确保您根本没有发送id 密钥。

我做了一个快速的最小测试,它似乎工作得很好:

var Sequelize = require('sequelize');
var sequelize = new Sequelize('cake3', 'root', 'root', 
    define: 
        timestamps: false
    ,
);
var User = sequelize.define('user1',         
        id: 
            type: Sequelize.INTEGER,
            autoIncrement: true,
            primaryKey: true
        ,
        name: 
            type: Sequelize.STRING
        
);

sequelize.transaction().then(function(t) 
    User.create(name:'test', 
        transaction: t
    ).then(function() 
        t.commit();
    ).catch(function(error) 
        console.log(error);
        t.rollback();
    );
);

表转储:

CREATE TABLE `user1s` (
  `id` int(11) NOT NULL,
  `name` varchar(20) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
ALTER TABLE `user1s`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `user1s`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1;

【讨论】:

您的代码帮助我发现了我的问题。在我的表定义中,我将 id 列设置为 AUTO_INCREMENT,但我没有设置它的初始值(AUTO_INCREMENT=1)。现在它工作得很好。非常感谢! 你检查过你是否有 NO_AUTO_VALUE_ON_ZERO 吗? github.com/sequelize/sequelize/issues/5493【参考方案2】:

在迁移中,添加这行代码:

await queryInterface.sequelize.query("ALTER TABLE table_name AUTO_INCREMENT = 1000000;");

【讨论】:

请详细说明如何使用这行代码

以上是关于在 MySQL 中使用 sequelize 自动递增 id的主要内容,如果未能解决你的问题,请参考以下文章

何时在 MYSQL 中使用 Sequelize?

使用 sequelize 在 mySql 中定义静态函数(如在 mongoose 中)

如何在 MySql 中使用 sequelize 运行多个原始查询?

Sequel自动生成Select语句

如何在 Sequelize 中使用 MySQL JSON 数据类型

node开发