엑셀 업로드를 통해 insert 쿼리 실행전에 중복 데이터를 검증할 수 있나요?

질문:

엑셀 업로드를 통해 INSERT 쿼리 실행전에 중복 데이터를 검증할 수 있나요?

답변:

네 아래와 같이 진행 가능합니다. 엑셀 업로드시 시트 데이터를 먼저 중복 검증하고 문제가 없는 경우 INSERT 쿼리(w/ forEach)를 실행하는 예제입니다.

  blocks:
    - type: query
      id: findNames
      resource: mysql.qa
      sqlType: select
      sql: |
        SELECT name FROM properties3
        WHERE name IN ('', :names)
      params:
        - key: names
      hidden: true
      autoload: false

    - type: query
      resource: mysql.qa
      sqlType: select
      sql: >
        SELECT 1
      actions:
        - label: 엑셀 업로드
          placement: right bottom
          single: true
          button: 
            type: success
          type: query
          resource: mysql.qa
          sqlType: insert
          sql: >
            INSERT INTO properties3
              SET name = :name    
          forEach: true
          params:
            - key: sheet
              format: sheet
              # accept: .csv,.xls,.xlsx
            - key: name
              valueFromSheet: 이름
            - key: address
              valueFromSheet: 주소
          
          requestFn: |
            const sheet = params.find(e => e.key == 'sheet')
            console.log('values >>>', sheet.values)
    
            if (sheet.values.length == 0) {
              // 취소
              toast('업로드 0건')
              return false
            }
    
            // 원본 엑셀데이터에서 가져오기
            const names = sheet.values.map(e => e['이름'])
    
            // 해당 블록 실행전에 param 넣기
            const param = findNames.$params.find(e => e.key == 'names')
            param.values = names
    
            // 실행 결과물 확인
            const findNamesResult = await findNames.trigger()
            console.log('>>findNamesResult', findNamesResult.rows)
    
            if (findNamesResult.rows.length) {
              const found = findNamesResult.rows.map(e => '- ' + e.name)
              toast(`이름 중복건이 있습니다: <br />${found.join('<br />')}`)
              return false
            }

이외 다른 방법으로 도움이 필요하신 경우 문의주시기 바랍니다.

감사합니다.