2015-11-18 25 views
8

Ich habe folgendes Modell in NodeJS mit sequelize und einer MySQL-Datenbank:Autoinkrement-ID mit sequelize in MySQL

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

Ich versuche, einen neuen Benutzer zu meinem databse mit dem folgenden Code hinzuzufügen:

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

Danach erhalte ich den nächsten Fehler:

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; 

Und die Fehlermeldung:

[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' 

Wenn ich jedoch manuell den ID-Wert festlegen, funktioniert es. Es scheint so zu sein, dass sequelize versucht, einen Standardwert im id-Feld zu setzen und stattdessen eine autoincrement-Ganzzahl zu setzen. Ich habe dieses Feld auch in meiner Datenbank als autoIncrement definiert.

Wie könnte ich diese Insertion machen? Muss ich die ID manuell einstellen?

EDIT

Dies ist meine Tabellendefinition:

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; 
+0

Was ist Ihre Datenbankstruktur:

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(); }); }); 

Tabelle Dump? Vielleicht ist es in MySQL selbst nicht richtig eingestellt? – Andrius

+0

@Andrius, Ich habe meine Frage zu aktualisieren, um diese Informationen hinzuzufügen – Genzotto

Antwort

9

Sie müssen sicher sein, Sie senden überhaupt nicht einmal die id Schlüssel.

Ich habe einen schnellen minimal Test gemacht und es schien sehr gut zu funktionieren: aussehen wie

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; 
+0

Ihr Code hat mir geholfen, mein Problem zu entdecken. In meiner Tabellendefinition habe ich die ID-Spalte als AUTO_INCREMENT gesetzt, aber ich habe ihren Anfangswert nicht gesetzt (AUTO_INCREMENT = 1). Jetzt funktioniert es schön. Vielen Dank! – Genzotto

+0

Haben Sie überprüft, ob Sie NO_AUTO_VALUE_ON_ZERO haben? https://github.com/sequelize/sequelize/issues/5493 – igorsf