Автоинкрементный ID с Sequelize в MySQL
Я столкнулся с проблемой при работе с моделью в 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({/* Данные пользователя без 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`, /* другие поля */) VALUES (DEFAULT, /* другие значения */);
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?
EDIT
Вот определение моей таблицы:
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;
Буду благодарен за помощь!
2 ответ(ов)
Вы должны быть уверены, что не отправляете ключ 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;
Если вы все еще получаете ошибки, убедитесь, что в объекте, который вы передаете в User.create
, отсутствует свойство id
. Sequelize автоматически управляет значением id
при использовании autoIncrement
.
В миграции добавьте следующую строку кода:
await queryInterface.sequelize.query("ALTER TABLE table_name AUTO_INCREMENT = 1000000;");
Эта команда изменяет начальное значение автоинкремента для указанной таблицы table_name
на 1,000,000. Это может быть полезно, если вам нужно установить определенное значение для автоинкрементируемого поля, например, чтобы избежать конфликтов с существующими данными. Uбедитесь, что значение, которое вы устанавливаете, больше текущего максимального значения автоинкрементируемого поля.
Как задать длину Sequelize.STRING?
Sequelize: Поиск по ассоциации
Как задать переменные окружения из файла package.json?
Удаление с использованием JOIN в MySQL
java.sql.SQLException: Не найден подходящий драйвер для jdbc:mysql://localhost:3306/dbname