nodejs续集:我无法更新主键字段的值

时间:2018-11-27 17:15:32

标签: mysql node.js sequelize.js

我可以更新除id(主键)之外的每个字段的值。这是一个网站。我希望能够通过网站更新ID。

module.exports = {
schema: function (sequelize, DataTypes) {
    return sequelize.define(
        'T_Event',
        {
            id: {
                type: DataTypes.STRING,
                primaryKey: true
            },
            user_id: {
                type: DataTypes.STRING
            },
            name: {
                type: DataTypes.STRING
            },
            created_at: {
                type: DataTypes.DATE
            },
            description: {
                type: DataTypes.STRING
            },
            image: {
                type: DataTypes.STRING
            },
            closed_at: {
                type: DataTypes.DATE
            }
        },
        {
            timestamps: true,
            paranoid: true,
            underscored: true,
            freezeTableName: true
        }
    )
}

我正在将sequelize 3.33.0与node和MySQL数据库一起使用。 所有属性都具有选择,插入和更新权限。

1 个答案:

答案 0 :(得分:0)

出于安全原因,Sequelize限制了这种操作。通常,通过运行时使用用户提供的信息更新主键是一个坏主意。这可能会导致各种问题,尤其是如果此时其他用户正在使用更改的对象。

我遵循经验法则:如果可以更改列值,则它不是主键的理想选择。如果所有列中都没有好的候选者,则仅出于此目的创建一个。

schema: function (sequelize, DataTypes) {
    return sequelize.define(
        'T_Event',
        {
            uid: {
                type: DataTypes.BIGINT,
                primaryKey: true,
                autoIncrement: true
            },
            id: {
                type: DataTypes.STRING,
                unique: true
            },
            // ...
    )
}

也就是说,在某些情况下这种解决方案是行不通的。在这种情况下,您可以使用一种解决方法,进行更新以更改ID:

T_Event.update(
    {
        id: new_value
    }, {
        where: {
            uid: current_value
        }
    }
);