mysql - Sequelize 将 MySQL 自增 id 设置为 null
问题描述
问题的症结在于 Sequelize 将我的插入对象的 id 设置为 null。我已经阅读了一堆相关的问题,对于我的生活,我似乎无法弄清楚。
这是 MySQL 5.7 表的架构
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
`password` varchar(255) NOT NULL,
`client_id` varchar(255) NOT NULL,
`ipaddress` varchar(50) DEFAULT NULL,
`enabled` tinyint(1) NOT NULL DEFAULT '1',
`createdAt` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`updatedAt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`roles` json DEFAULT NULL,
`provider` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `users_id_uindex` (`id`),
UNIQUE KEY `table_nameusers_username_uindex` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
这是 Sequelize 模型,注意我有 primaryKey: true 和 autoIncrement: true
module.exports = function (sequelize, DataTypes) {
return sequelize.define('User',
{
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
},
username: {
type: DataTypes.STRING,
},
password: DataTypes.STRING,
client_id: DataTypes.STRING,
ipaddress: DataTypes.STRING,
enabled: DataTypes.BOOLEAN,
roles: [],
provider: DataTypes.STRING,
});
};
这是您尝试再次插入时引发的错误。注意 id: null
{
"type": "error",
"message": "PRIMARY must be unique",
"error": {
"name": "SequelizeUniqueConstraintError",
"errors": [
{
"message": "PRIMARY must be unique",
"type": "unique violation",
"path": "PRIMARY",
"value": "0",
"origin": "DB",
"instance": {
"id": null,
"username": "testuser",
"password": "<password string>",
"roles": [
"user",
"mysql"
],
"provider": "SOMETHING",
"client_id": "",
"enabled": true,
"updatedAt": "2019-04-12T15:08:44.068Z",
"createdAt": "2019-04-12T15:08:44.068Z"
},
"validatorKey": "not_unique",
"validatorName": null,
"validatorArgs": []
}
],
"fields": {
"PRIMARY": "0"
},
"parent": {
"code": "ER_DUP_ENTRY",
"errno": 1062,
"sqlState": "23000",
"sqlMessage": "Duplicate entry '0' for key 'PRIMARY'",
"sql": "INSERT INTO `Users` (`id`,`username`,`password`,`client_id`,`enabled`,`roles`,`provider`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?,?,?,?,?,?,?);"
},
"original": {
"code": "ER_DUP_ENTRY",
"errno": 1062,
"sqlState": "23000",
"sqlMessage": "Duplicate entry '0' for key 'PRIMARY'",
"sql": "INSERT INTO `Users` (`id`,`username`,`password`,`client_id`,`enabled`,`roles`,`provider`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?,?,?,?,?,?,?);"
},
"sql": "INSERT INTO `Users` (`id`,`username`,`password`,`client_id`,`enabled`,`roles`,`provider`,`createdAt`,`updatedAt`) VALUES (DEFAULT,?,?,?,?,?,?,?,?);"
}
}
预期结果:id 字段将成为下一个自增 id。
实际结果:id字段在数据库中始终为0,在Sequelize对象中为null。
顺便说一句,我通过手动创建表并允许 Sequelize 在 sync() 期间创建表来运行它。
解决方案
推荐阅读
- javascript - 动态键的调用方法
- python - PySpark 异常:Java 网关进程在发送其端口号之前退出
- jira - 如何使用 java 创建 JIRA 项目?
- java - 接口的 Spring Boot 存储库
- c++ - 用于发送和接收消息的客户端代码
- python - 数组中多个文件的异步处理 - Python
- android - 如果我们使用应用程序上下文而不是活动上下文来启动活动,会有什么区别?
- python-2.7 - 当我在 python 2.7.15 中使用 virtualenv 时 pip install leveldb 出了点问题
- javascript - 为什么删除了数组的旧内容?
- php - Symfony 3 - 覆盖包模板 - prependPath 不起作用