对没有列'id'的表进行排序


71

我有一个表的以下顺序定义:

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它显然具有的功能?

Answers:


110

如果您未定义,primaryKey则使用sequelizeid默认情况下。

如果要设置自己的,只需使用 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
});

2
如果module_id和academy_id都为主键怎么办?
马克·拉斯穆森

一个表只能有一个主键,除非您创建一个复合主键。我不确定Sequelize是否支持此功能。
Ben Fortune

16
忽略以上内容,Sequelize确实支持这一点。只需添加primaryKey: true到要用作主键的列即可。
Ben Fortune

6
为什么这甚至被视为答案?问题非常明确:“如何禁用id其明确具有的功能?” 并且此答案尝试使用“如果您愿意,您可以更改主键的名称”来回答。什么??
安德烈亚斯

5
根据sequelize的配置,可以定义哪个现有/定义的字段为id(您可以将多个filds设置为primaryKey: true),如果表上没有id,则sequelize Legazy文档说您可以将其删除,Model.removeAttribute('id');然后将有一个没有主键的表(模型)。
亚伦C

34

如果要完全禁用表的主键,可以使用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');

1
也就是说,除非您想加入具有唯一索引的非主键列
Andy

16

对于复合主键,应在主键的所有列部分添加“ primaryKey:true”。Sequelize认为此类列是组合主键的一部分。


如何使用sequelize-cli删除自定义主键,就像这样的sequelize模型:create --name MyUsera --attributes first_name:Integer:primaryKey:true,last_name:string,bio:text
Rizwan Patel

那是在2015年,我不知道发生了什么。如何使用复合键建立关系?
菲尔(Phil)

14

如果您的模型没有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列。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.