没有列'id'的续集表

时间:2015-03-24 13:27:17

标签: javascript mysql node.js sequelize.js

我有一个表的下面的sequelize定义:

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

正如您所看到的,此表中没有id列。但是,当我尝试插入它仍然尝试以下sql:

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

如何禁用显式的id功能?

5 个答案:

答案 0 :(得分:54)

如果您没有定义primaryKey,则默认情况下,续集使用id

如果您想自己设置,只需在列上使用primaryKey: true

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

答案 1 :(得分:16)

如果要完全禁用表的主键,可以使用Model.removeAttribute。请注意,这可能会导致将来出现问题,因为Sequelize是一个ORM,并且连接需要额外的设置。

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');

答案 2 :(得分:9)

对于复合主键,您应该将“primaryKey:true”添加到主键的所有列部分。 Sequelize认为这些列是复合主键的一部分。

答案 3 :(得分:5)

如果您的模型没有ID列,您可以使用Model.removeAttribute(' id');摆脱它。

请参阅http://docs.sequelizejs.com/en/latest/docs/legacy/

所以在你的情况下,它将是

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');

注意: 你似乎在制作一个连接表。考虑制作academy_id module_id主键。这样,相同的链接将无法多次出现,并且数据库不会徒劳地创建隐藏的id列。

答案 4 :(得分:0)

在这个解决方案中,sequelize 添加了带有列名 id 的默认主键。 使用您自己定义的主键添加 primaryKey: true

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