在MySQL中使用sequelize自动增加id

Gen*_*tto 21 mysql node.js sequelize.js

我在NodeJS中有以下模型,包括sequelize和MySQL数据库:

var Sequelize = require('sequelize');
var User = sequelize.define('user', {        
        id: {
            type: Sequelize.INTEGER,
            autoIncrement: true,
            primaryKey: true
        },
        ...
};
Run Code Online (Sandbox Code Playgroud)

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

sequelize.transaction().then(function(t) {
        User.create({/* User data without id */}, {
            transaction: t
        }).then(function() {
            t.commit();
        }).catch(function(error) {
            t.rollback();
        });
    });
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

并且错误消息:

[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'
Run Code Online (Sandbox Code Playgroud)

但是,如果我手动设置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;
Run Code Online (Sandbox Code Playgroud)

And*_*ius 23

你必须确定你根本不发送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();
    });
});
Run Code Online (Sandbox Code Playgroud)

表转储:

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;
Run Code Online (Sandbox Code Playgroud)

  • 你的代码帮助我发现了我的问题.在我的表定义中,我将id列设置为AUTO_INCREMENT,但我没有设置其初始值(AUTO_INCREMENT = 1).现在它适用于beautifly.非常感谢你! (2认同)