INSERT
쿼리에서 VALUES ?
플레이스홀더 사용MySQL에서 여러 레코드를 한 번에 삽입하려면 INSERT INTO ... VALUES ?
구문을 사용할 수 있다. 이때 ?
플레이스홀더는 배열의 배열 형식으로 전달되어야 하는데, 이를 제대로 사용하지 않으면 SQL 구문에서 오류가 발생한다.
다음과 같은 SQL 구문을 사용했을 때 오류가 발생
const queryData = [sector_id, difficulty, title, description, hint, explanation, reference];
// 쿼리 실행
const [rows] = await pools.PROBLEM_DB.query(
"INSERT INTO problems (sector_id, difficulty, title, description, hint, explanation, reference) VALUES ?",[queryData]);
에러 메시지:
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '3' at line 1
VALUES ?
구문은 배열 안에 배열 형태로 값을 전달받는다. 따라서 queryData
는 단일 배열로 되어 있었고, 이는 INSERT INTO ... VALUES ?
에서 예상하는 형식과 맞지 않았다. queryData
를 배열 안에 배열 즉, 2차원 배열로 감싸면 문제를 해결할 수 있다. INSERT INTO ... VALUES ?
는 한 번에 여러 개의 레코드를 삽입할 때 사용되므로, 삽입하려는 데이터는 배열의 배열 형식으로 전달되어야 한다.
const queryData = [
[sector_id, difficulty, title, description, hint, explanation, reference]
];
// 쿼리 실행
const [rows] = await pools.PROBLEM_DB.query(
"INSERT INTO problems (sector_id, difficulty, title, description, hint, explanation, reference) VALUES ?", [queryData]);