> 데이터 베이스 > MySQL 튜토리얼 > PostgreSQL의 ON CONFLICT 절에서 여러 충돌 대상을 처리하는 방법은 무엇입니까?

PostgreSQL의 ON CONFLICT 절에서 여러 충돌 대상을 처리하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-12 17:44:43
원래의
450명이 탐색했습니다.

How to Handle Multiple Conflict Targets in PostgreSQL's ON CONFLICT Clause?

ON CONFLICT 절에서 여러 충돌 대상 사용

테이블에 여러 개의 고유 열이 포함되어 있고 충돌 시 다른 열을 업데이트하기 위해 INSERT ... ON CONFLICT ... DO UPDATE 구문이 필요한 경우 모든 충돌 대상 열을 포함하는 고유 인덱스를 생성해야 합니다.

질문:

ON CONFLICT 절에서 여러 열을 충돌 대상으로 사용하려고 하면 충돌 감지를 수행하기 위해 고유 인덱스가 필요하기 때문에 오류가 발생합니다. 다음 예를 고려해보세요.

<code class="language-sql">INSERT INTO table
...
ON CONFLICT (col1, col2)
DO UPDATE
SET
....</code>
로그인 후 복사
로그인 후 복사

해결책:

이 문제를 해결하려면 두 열 모두에 고유 인덱스를 생성하세요.

<code class="language-sql">CREATE UNIQUE INDEX idx_t_col1_col2 ON table (col1, col2);</code>
로그인 후 복사

고유 인덱스를 생성한 후 ON CONFLICT 절은 두 개의 열을 충돌 대상으로 지정하여 충돌 시 원하는 업데이트 동작을 달성할 수 있습니다.

<code class="language-sql">INSERT INTO table
...
ON CONFLICT (col1, col2)
DO UPDATE
SET
....</code>
로그인 후 복사
로그인 후 복사

예:

고유한 열 ida이 있는 테이블을 만들고 충돌을 처리하는 동안 데이터를 삽입합니다.

<code class="language-sql">CREATE TABLE t (id integer, a text, b text);
CREATE UNIQUE INDEX idx_t_id_a ON t (id, a);
INSERT INTO t VALUES (1, 'a', 'foo');
INSERT INTO t VALUES (1, 'a', 'bar') ON CONFLICT (id, a) DO UPDATE SET b = 'bar';</code>
로그인 후 복사

업데이트된 데이터를 확인하기 위한 쿼리 실행:

<code class="language-sql">SELECT * FROM t;</code>
로그인 후 복사

출력:

<code> id | a |  b  
----+---+-----
  1 | a | bar</code>
로그인 후 복사

위 내용은 PostgreSQL의 ON CONFLICT 절에서 여러 충돌 대상을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿