sequelize 批量更新的唯一索引

Posted by CodingWithAlice on January 25, 2024

sequelize 批量更新的唯一索引

批量更新 daily_data 时,当 时间+序号 重复时,更新数据,而不是再创建一条

步骤1:sequelize 中声明 modal 时声明「唯一索引」

sequelize.define(table, {...}, {
    indexes: [
        {
            unique: true,
            fields: ['date', 'day_sort'] // 为 date 和 sort 字段组合设置唯一索引
        }
    ]
})

步骤2:在 mysql 中也进行唯一索引的关联

-- 检查是否存在唯一索引
SHOW INDEX FROM `daily` WHERE Column_name IN ('date', 'day_sort');
-- 创建唯一索引
CREATE UNIQUE INDEX idx_date_day_sort ON `daily` (`date`, `day_sort`);

步骤3:bulkCreate 配置 updateOnDuplicate 参数

await DailyModal.bulkCreate(body?.data, {
    updateOnDuplicate: [
        'routineTypeId',
        'startTime',
        'endTime',
        'duration',
        'weekday',
        'interval',
    ],
})

补充

详细看下 sequelize.define 可以接收的第三个参数 - 常用配置属性

const User = sequelize.define('User', {
    // 字段定义
}, {
    // 1、tableName - 指定数据库中的表名
    tableName: 'users', // 指定表名为 'users'
    // 2、timestamps - 是否自动添加 createdAt 和 updatedAt 字段,默认为 true
    timestamps: false, // 禁用时间戳字段
    // 3、paranoid - 启用软删除(即删除时不会真正删除数据,而是设置 deletedAt 字段),默认为 false
    paranoid: true, // 启用软删除
    // 4、underscored - 将字段名自动转换为下划线命名,默认为 false
    underscored: true, // 将 createdAt 映射为 created_at
    // 5、freezeTableName - 禁止 Sequelize 自动将表名转换为复数形式,默认为 false
    freezeTableName: true, // 表名保持为 'User',而不是 'Users'
    // 6、indexes - 定义表的索引
    indexes: [
        {
            unique: true,
            fields: ['email'] // 在 email 字段上创建唯一索引
        }
    ]
});