개발/postgresql / / 2023. 1. 20. 20:37

INSERT 중복되는 값을 쿼리 내부에서 예외처리

반응형

https://stackoverflow.com/questions/4069718/postgres-insert-if-does-not-exist-already

 

Postgres: INSERT if does not exist already

I'm using Python to write to a postgres database: sql_string = "INSERT INTO hundred (name,name_slug,status) VALUES (" sql_string += hundred + ", '" + hundred_slug + "', " + status + ");" cursor.ex...

stackoverflow.com

위 사이트에서 존재하지 않으면 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라는 키워드를 사용하지 않고 넣어야했다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유