web-dev-qa-db-fra.com

table de séquençage sans colonne 'id'

j'ai la définition suivante d'une table:

AcademyModule = sequelize.define('academy_module', {
        academy_id: DataTypes.INTEGER,
        module_id: DataTypes.INTEGER,
        module_module_type_id: DataTypes.INTEGER,
        sort_number: DataTypes.INTEGER,
        requirements_id: DataTypes.INTEGER
    }, {
        freezeTableName: true});

Comme vous pouvez le constater, il n'y a pas de colonne id dans ce tableau. Cependant, lorsque j'essaie de l'insérer, il essaie toujours le SQL suivant:

 INSERT INTO `academy_module` (`id`,`academy_id`,`module_id`,`sort_number`) VALUES (DEFAULT,'3',5,1);

Comment puis-je désactiver la fonction id dont il dispose clairement?

45
Marc Rasmussen

Si vous ne définissez pas un primaryKey alors séquençage utilise id par défaut.

Si vous voulez définir le vôtre, utilisez simplement primaryKey: true sur votre colonne.

AcademyModule = sequelize.define('academy_module', {
    academy_id: {
        type: DataTypes.INTEGER,
        primaryKey: true
    },
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});
63
Ben Fortune

Si vous souhaitez désactiver complètement la clé primaire de la table, vous pouvez utiliser Model.removeAttribute. Soyez averti que cela pourrait causer des problèmes à l'avenir, car Sequelize est un ORM et les jointures nécessiteront une configuration supplémentaire.

const AcademyModule = sequelize.define('academy_module', {
    academy_id: DataTypes.INTEGER,
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});
AcademyModule.removeAttribute('id');
19
Ben Fortune

Pour une clé primaire composite, vous devez ajouter "primaryKey: true" à toutes les colonnes faisant partie de la clé primaire. Sequelize considère que ces colonnes font partie d’une clé primaire composite.

11
gaurav

Si votre modèle ne possède pas de colonne ID, vous pouvez utiliser Model.removeAttribute ('id'); s'en débarasser.

Voir http://docs.sequelizejs.com/en/latest/docs/legacy/

Donc dans votre cas ce serait

AcademyModule = sequelize.define('academy_module', {
    academy_id: DataTypes.INTEGER,
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});
AcademyModule.removeAttribute('id');

Remarque: Vous semblez créer une table de jointure. Envisagez de faire academy_id etmodule_id clés primaires. Ainsi, le même lien ne pourra pas apparaître plusieurs fois et la base de données ne créera pas de colonne d'identifiant masqué en vain.

6
Andreas