programing

NodeJs용 MariaDB 커넥터 | 존재하지 않는 경우 값을 삽입하는 방법

bestprogram 2023. 6. 6. 10:26

NodeJs용 MariaDB 커넥터 | 존재하지 않는 경우 값을 삽입하는 방법

풀에서 일괄 쿼리를 실행하려고 합니다.쿼리 자체는 간단하지만 NodeJS Connector에 문제가 있습니다.

'?' 자리 표시자에 대한 쿼리는

INSERT INTO region (region_code, country_code, continent_code) SELECT * FROM
(SELECT ?, ?, ?) AS tmp WHERE NOT EXISTS (SELECT region_code FROM region WHERE region_code = ?) LIMIT 1

제가 달성하고자 하는 것은 삽입하기 전에 값이 있는지 확인하는 것입니다. 제가 사용하는 TS 코드는 다음과 같습니다.

const INSERT_REGION =
  'INSERT INTO region (region_code, country_code, continent_code) SELECT * FROM
(SELECT ?, ?, ?) AS tmp WHERE NOT EXISTS (SELECT region_code FROM region WHERE region_code = ?) LIMIT 1';

const insertRegionParam = [['ITC1', 'ITA', 'EU', 'ITC1'] , ['ITP1', 'ITA', 'EU', 'ITP1'] ]

  private insertRegions$(insertRegionParam: string[][]) {
    return from(this.pool.batch(INSERT_REGION, insertRegionParam)).pipe(
      catchError((err: mdb.SqlError) => throwError(() => err))
    );
  }

다음 오류가 발생합니다.

R_DUP_FIELDNAME: Duplicate column name '?'
sql: INSERT INTO region (region_code, country_code, continent_code) SELECT * FROM
    (SELECT ?, ?, ?) AS tmp WHERE NOT EXISTS (SELECT region_code FROM region WHERE region_code = ?) LIMIT 1
    at /code/dist/resources/regions-sectors/regions-sectors.controller.js:24:22
    at /code/node_modules/rxjs/dist/cjs/internal/operators/catchError.js:13:51
    at OperatorSubscriber._this._error (/code/node_modules/rxjs/dist/cjs/internal/operators/OperatorSubscriber.js:43:21)
    at Subscriber.error (/code/node_modules/rxjs/dist/cjs/internal/Subscriber.js:60:18)
    at Subscriber._error (/code/node_modules/rxjs/dist/cjs/internal/Subscriber.js:84:30)
    at Subscriber.error (/code/node_modules/rxjs/dist/cjs/internal/Subscriber.js:60:18)
    at Observable.init [as _subscribe] (/code/node_modules/rxjs/dist/cjs/internal/observable/throwError.js:8:58)
    at Observable._trySubscribe (/code/node_modules/rxjs/dist/cjs/internal/Observable.js:41:25)
    at /code/node_modules/rxjs/dist/cjs/internal/Observable.js:35:31
    at Object.errorContext (/code/node_modules/rxjs/dist/cjs/internal/util/errorContext.js:22:9)

예를 들어 문자열이 구문 분석되지 않은 경우

다음이 있습니다.

FROM (SELECT ?, ?, ?) AS tmp

하위 쿼리에 가입하거나 하위 쿼리에서 선택할 때, 이렇게 형성된 "테이블"(이 경우 tmp)은 이름으로 열을 사용하지 않는 컨텍스트에서도 각 열에 대해 고유한 이름을 가져야 합니다.임의의 이름을 지정할 수 있습니다.

FROM (SELECT ? x, ? y, ? z) AS tmp

그러나 다음 값을 반영하는 이름을 사용하는 것이 좋습니다.

FROM (SELECT ? region_code, ? country_code, ? continent_code) AS tmp

언급URL : https://stackoverflow.com/questions/76096073/mariadb-connector-for-nodejs-how-to-insert-value-if-not-exists