> 데이터 베이스 > MySQL 튜토리얼 > PostgreSQL 다중 행 업데이트에서 NULL 값을 처리하는 방법은 무엇입니까?

PostgreSQL 다중 행 업데이트에서 NULL 값을 처리하는 방법은 무엇입니까?

DDD
풀어 주다: 2025-01-04 01:08:39
원래의
831명이 탐색했습니다.

How to Handle NULL Values in PostgreSQL Multi-Row Updates?

다중 행 업데이트에서 NULL 값 캐스팅

PostgreSQL에서 NULL 값으로 여러 행을 업데이트하면 독립 실행형 VALUES 표현식에 대한 유형 데이터가 없기 때문에 오류가 발생할 수 있습니다. 이 문제를 극복할 수 있는 몇 가지 솔루션은 다음과 같습니다.

1. LIMIT 0이 있는 행 선택, UNION ALL VALUES가 있는 행 추가

이 방법은 LIMIT 0 하위 쿼리를 사용하여 테이블에서 열 이름과 유형을 검색합니다. 이는 업데이트된 값을 캐스팅하는 데 사용되는 행 유형을 정의합니다.

UPDATE foo f
SET    x = t.x
     , y = t.y
FROM  (
  (SELECT pkid, x, y FROM foo LIMIT 0) -- parenthesis needed with LIMIT
   UNION ALL
   VALUES
      (1, 20, NULL)  -- no type casts here
    , (2, 50, NULL)
   ) t               -- column names and types are already defined
WHERE  f.pkid = t.pkid;
로그인 후 복사

2. LIMIT 0으로 행 선택, UNION ALL SELECT로 행 추가

이전 방법과 유사하지만 VALUES 표현식 대신 SELECT를 사용하여 행을 추가하므로 잠재적인 유형 확인 문제가 방지됩니다.

UPDATE foo f
SET    x = t.x
     , y = t.y
FROM  (
  (SELECT pkid, x, y FROM foo LIMIT 0) -- parenthesis needed with LIMIT
   UNION ALL SELECT 1, 20, NULL
   UNION ALL SELECT 2, 50, NULL
   ) t               -- column names and types are already defined
WHERE  f.pkid = t.pkid;
로그인 후 복사

3. 열별 유형의 VALUES 표현식

이 접근 방식은 NULL 값의 행을 VALUES 표현식의 첫 번째 행으로 사용하여 열 유형을 효과적으로 정의합니다. 후속 행은 명시적인 형변환 없이 업데이트될 수 있습니다.

...
FROM  (
   VALUES 
     ((SELECT pkid FROM foo LIMIT 0)
    , (SELECT x    FROM foo LIMIT 0)
    , (SELECT y    FROM foo LIMIT 0))  -- get type for each col individually
   , (1, 20, NULL)
   , (2, 50, NULL)
   ) t (pkid, x, y)  -- columns names not defined yet, only types.
...
로그인 후 복사

4. 행 유형을 사용한 VALUES 표현식

이 방법은 행 유형을 사용하여 열 유형을 암시적으로 정의합니다. 행은 테이블을 나타내는 행 유형으로 변환되며, 개별 열은 필드 선택을 통해 액세스할 수 있습니다.

UPDATE foo f
SET x = (t.r).x         -- parenthesis needed to make syntax unambiguous
  , y = (t.r).y
FROM (
   VALUES
      ('(1,20,)'::foo)  -- columns need to be in default order of table
     ,('(2,50,)')       -- nothing after the last comma for NULL
   ) t (r)              -- column name for row type
WHERE  f.pkid = (t.r).pkid;
로그인 후 복사

5. 분해된 행 유형을 사용하는 VALUES 표현식

이전 방법과 유사하지만 표준 구문에서 분해된 행 값을 사용합니다.

UPDATE foo f
SET    x = t.x
     , y = t.y
FROM (
   VALUES
      (('(1,20,)'::foo).*)  -- decomposed row of values
    , (2, 50, NULL)
   ) t(pkid, x, y)  -- arbitrary column names (I made them match)
WHERE  f.pkid = t.pkid;     -- eliminates 1st row with NULL values
로그인 후 복사

결론

LIMIT 0인 행을 선택하는 동안 빠르고 널리 사용되는 방법이므로 일부 값에 대해 유형 분석이 불가능하면 실패할 수 있습니다. 다른 방법은 관련된 열과 행의 수에 따라 성능에 영향을 미치는 대체 접근 방식을 제공합니다. 궁극적으로 방법 선택은 특정 요구 사항 및 기존 코드와의 호환성에 따라 달라집니다.

위 내용은 PostgreSQL 다중 행 업데이트에서 NULL 값을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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