반응형
https://stackoverflow.com/questions/4069718/postgres-insert-if-does-not-exist-already
위 사이트에서 존재하지 않으면 insert하지 않도록 하는 쿼리문이 필요하였다.
WITH input_sender_index AS (SELECT index FROM user_info WHERE name = $1),
input_receiver_index AS (SELECT index FROM user_info WHERE name = $2)
INSERT INTO friend(sender_index, receiver_index)
VALUES(
SELECT input_receiver_index.index, input_receiver_index.index
WHERE NOT EXISTS(
SELECT * FROM friend WHERE sender_index = input_receiver_index.index
AND receiver_index = input_receiver_index.index
)
)
이와 같이 작성하였다.
실제로 실행해보다가 오류가 발생해서 다음 코드로 변경하였다.
WITH input_sender_index AS (SELECT index FROM user_info WHERE name = $1),
input_receiver_index AS (SELECT index FROM user_info WHERE name = $2)
INSERT INTO friend(sender_index, receiver_index)
(
SELECT
(SELECT index FROM input_sender_index),
(SELECT index FROM input_receiver_index)
WHERE NOT EXISTS(
SELECT * FROM friend WHERE sender_index = (SELECT index FROM input_sender_index)
AND receiver_index = (SELECT index FROM input_receiver_index)
)
)
CTE로 작성한 table의 key는 '.'으로 접근하지 못한다는 걸 깜박하고 있었다. 간단한 접근법이 있으면 좋겠지만 SELECT 서브쿼리를 이용하는 수 밖에 없다.
또한 SELECT절을 insert의 values로 넣으려면 values라는 키워드를 사용하지 않고 넣어야했다.
반응형
'개발 > postgresql' 카테고리의 다른 글
[Capstone Project] ERROR: could not identify an equality operator for type json (0) | 2023.03.14 |
---|---|
postgersql serial사용을 위한 grant sequence (0) | 2023.03.09 |
PostgreSQL 환경설정 Intellij로 connect하기 + java code로 실행하기 (0) | 2022.04.08 |