Skip to content

数据批量更新

BatachUpdate Param DTS

ts
/**
 * 表参数配置
 */
export interface TableConfig {
  /**
   * 表名
   */
  name: string
  /**
   * 表别名
   */
  alias?: string
}

export type TABLE_TYPE = string | TableConfig

/**
 * 数据变更基础参数
 */
export interface BaseChangeParam {
  /**
   * 表名
   */
  t: TABLE_TYPE
}

/**
 * 唯一约束更新
 */
export interface DuplicateUpdateParam extends BaseChangeParam {
  /**
   * 配置参数
   */
  data: IAnyObject[]
  /**
   * 唯一索引字段名
   */
  unique?: string
  /**
   * 不更新字段
   */
  excludeField?: string | string[]
}

export interface BatchUpdateParam extends BaseChangeParam {
  /**
   * 条件字段
   */
  conditionField: string
  /**
   * 数据
   */
  data: IAnyObject[]
}

/**
 * 批量更新类型
 * @DUPLICATE 唯一索引批量更新
 * @CASE_WHEN CASE WHEN THEN 语句批量更新
 * @TEMPORARY 临时表批量更新
 */
export type BATCH_TYPE = 'DUPLICATE' | 'CASE_WHEN' | 'TEMPORARY'

/**
 * 批量更新数据参数
 */
export interface BATCH_UPDATE_PARAMS {
  type: BATCH_TYPE
  params: DuplicateUpdateParam | BatchUpdateParam
}

Example

唯一索引 DUPLICATE 更新

注意事项

唯一索引 DUPLICATE 批量更新数据,唯一索引不存在会新增数据,如果不确认业务需求请谨慎使用,请确保表字段存在唯一索引约束否则会导致重复数据插入。更新数据前确保数据表结构已经存在。否者执行会抛出 '[table name]' doesn't exist 异常。

ts
import emysql from '@dpapejs/emysql'

// 数据库实例化
const mysql = new emysql({
  password: '[db登录密码]',
  user: '[db登录用户名]',
  database: '访问数据库名称'
})

mysql.change
  .batchUpdate({
    type: 'DUPLICATE',
    params: {
      t: 't_user',
      data: [
        {
          name: '张三',
          age: 15,
          sex: 1,
          create_at: new Date(),
          unionid: 'a'
        },
        {
          name: '李四',
          age: 18,
          sex: 0,
          create_at: new Date(),
          unionid: 'b'
        },
        {
          name: '王五',
          age: 14,
          sex: 1,
          create_at: new Date(),
          unionid: 'c'
        }
      ],
      unique: 'unionid',
      excludeField: ['id', 'create_at']
    }
  })
  .then((result) => {
    // 插入数据成功 当 unionid 存在更新相关数据, 不存在则新增一条新增数据
  })
  .catch((err) => {
    // 插入数据失败
    console.error('[ERROR]::', err)
  })

CASE WHEN 批量更新

ts
import emysql from '@dpapejs/emysql'

// 数据库实例化
const mysql = new emysql({
  password: '[db登录密码]',
  user: '[db登录用户名]',
  database: '访问数据库名称'
})

mysql.change
  .batchUpdate({
    type: 'CASE_WHEN',
    params: {
      t: 't_user',
      data: [
        {
          name: '张三',
          age: 15,
          sex: 1,
          create_at: new Date(),
          unionid: 'a'
        },
        {
          name: '李四',
          age: 18,
          sex: 0,
          create_at: new Date(),
          unionid: 'b'
        },
        {
          name: '王五',
          age: 14,
          sex: 1,
          create_at: new Date(),
          unionid: 'c'
        }
      ],
      conditionField: 'unionid'
    }
  })
  .then((result) => {
    // 符合条件批量更新成功
  })
  .catch((err) => {
    // 插入数据失败
    console.error('[ERROR]::', err)
  })

TEMPORARY 临时表批量更新

ts
import emysql from '@dpapejs/emysql'

// 数据库实例化
const mysql = new emysql({
  password: '[db登录密码]',
  user: '[db登录用户名]',
  database: '访问数据库名称'
})

mysql.change
  .batchUpdate({
    type: 'TEMPORARY',
    params: {
      t: 't_user',
      data: [
        {
          name: '张三',
          age: 15,
          sex: 1,
          create_at: new Date(),
          unionid: 'a'
        },
        {
          name: '李四',
          age: 18,
          sex: 0,
          create_at: new Date(),
          unionid: 'b'
        },
        {
          name: '王五',
          age: 14,
          sex: 1,
          create_at: new Date(),
          unionid: 'c'
        }
      ],
      conditionField: 'unionid'
    }
  })
  .then((result) => {
    // 符合条件批量更新成功
  })
  .catch((err) => {
    // 插入数据失败
    console.error('[ERROR]::', err)
  })