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

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

Linda Hamilton
풀어 주다: 2025-01-03 04:06:42
원래의
409명이 탐색했습니다.

How to Handle NULL Type Casting in PostgreSQL Multi-Row Updates?

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

PostgreSQL에서 여러 행에 대해 업데이트 쿼리를 실행하면 NULL을 처리할 때 오류가 발생할 수 있습니다. 열 유형이 명시적으로 캐스트되지 않은 경우 값입니다. 이 문서에서는 이 문제에 대한 몇 가지 해결 방법을 살펴보고 다중 행 업데이트 중에 적절한 유형 캐스팅을 보장하기 위한 대체 접근 방식을 제공합니다.

해결 방법 1: VALUES 및 UNION ALL을 사용하여 제한 0을 선택

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

이 방법은 SELECT 문을 LIMIT 0과 결합하여 열 이름과 유형을 검색한 다음 UNION ALL 연산자. 하위 쿼리의 첫 번째 행은 후속 행에 대해 적절한 열 유형이 정의되었는지 확인합니다.

해결책 2: VALUES 및 UNION ALL SELECT를 사용하여 Limit 0을 선택합니다

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

솔루션 1과 유사하게 이 접근 방식은 SELECT를 사용하여 열 유형을 가져온 다음 개별 SELECT 문을 사용하여 데이터 행을 추가하여 조기 오류를 방지합니다. 유형 캐스팅.

솔루션 3: 열별 유형을 사용하는 VALUES 표현식

UPDATE foo f
SET    x = t.x
     , y = t.y
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.
...
로그인 후 복사

이 솔루션은 VALUES 표현식 자체 내에서 열 유형을 정의하여 후속 항목이 행은 자동 유형으로 인해 오류가 발생하지 않고 해당 유형으로 캐스팅됩니다. 가정.

해결책 4: 행 유형이 있는 VALUES 표현식

UPDATE foo f
SET x = (t.r).x         -- Parenthesis for unambiguous syntax
  , y = (t.r).y
FROM (
   VALUES
      ('(1,20,)'::foo)  -- Columns need to be in table default order
     ,('(2,50,)')       -- Nothing after 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 (match table columns)
WHERE  f.pkid = t.pkid;     -- Eliminates 1st row with NULL values
로그인 후 복사

해결책 4와 유사하지만 분해된 행을 사용 데이터 값을 지정합니다. 이를 통해 관련 열만 제공할 수 있으므로 테이블에 있는 모든 열의 전체 순서와 유형을 알 필요가 없습니다.

최적의 솔루션 선택은 성능, 편의성, 가용성과 같은 요소에 따라 달라집니다. 열 유형에 대한 정보입니다.

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

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