首页 > 解决方案 > Sequelize:如何使用指定的列重复进行更新

问题描述

如果具有指定列名的记录不匹配或不存在,我想创建新记录,否则更新它。

我有一个这样命名AssignedDownloadRoute并定义它的模型

AssignedDownloadRoute.init(
  {
    assigned_download_route_id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      allowNull: false,
    },
    route_code: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    assigned_user_id: {
      type: DataTypes.INTEGER,
      allowNull: false,
    },
    assigner_user_id: {
      type: DataTypes.INTEGER,
      allowNull: false,
    },
    reading_period: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    created_modified: {
      type: DataTypes.DATE,
      allowNull: false,
      defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
    }
  },
  {
    sequelize: DBInstance,
    modelName: 'AssignedDownloadRoute',
    tableName: 'assigned_download_route',
    timestamps: false,
  }
);

假设我有想要插入的数据,但是一旦我已经插入它,它就不应该创建新记录,而是更新/覆盖它。

const bulkData = [
  {
    route_code: '123',
    assigned_user_id: 3,
    assigner_user_id: 26,
    reading_period: '202105',
    created_modified: '2021-06-11 06:36:20'
  },
  {
    route_code: '456',
    assigned_user_id: 4,
    assigner_user_id: 32,
    reading_period: '202105',
    created_modified: '2021-06-11 06:36:20'
  }
]

当我尝试bulkCreate使用updateOnDuplicate选项运行时,它不会更新现有记录,而是创建新记录。我希望现有数据仅在列名匹配/已经存在时assigned_user_id更新。assigner_user_idroute_code

AssignedDownloadRoute.bulkCreate(bulkData, {
   updateOnDuplicate: ['assigned_user_id', 'assigner_user_id'],
});

标签: mysqlnode.jssequelize.js

解决方案


看起来您的模型中只有一个字段可以作为唯一字段 ( assigned_download_route_id),因为它被定义为主键。由于该值不包含在您的有效负载中,因此每个有效负载没有任何独特之处。如果您想route_code成为唯一值,则必须在模型中使用unique: true选项相应地定义它。

AssignedDownloadRoute.init(
  {
    assigned_download_route_id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      allowNull: false,
    },
    route_code: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
    },
    assigned_user_id: {
      type: DataTypes.INTEGER,
      allowNull: false,
    },
    assigner_user_id: {
      type: DataTypes.INTEGER,
      allowNull: false,
    },
    reading_period: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    created_modified: {
      type: DataTypes.DATE,
      allowNull: false,
      defaultValue: Sequelize.literal('CURRENT_TIMESTAMP')
    }
  },
  {
    sequelize: DBInstance,
    modelName: 'AssignedDownloadRoute',
    tableName: 'assigned_download_route',
    timestamps: false,
  }
);

有关选项的更多详细信息Models以及更复杂的唯一键定义(例如复合键)可以在此处阅读:https ://sequelize.org/master/manual/model-basics.html


推荐阅读