> 데이터 베이스 > MySQL 튜토리얼 > PostgreSQL에서 NULL 값을 사용하여 여러 행을 효율적으로 업데이트하는 방법은 무엇입니까?

PostgreSQL에서 NULL 값을 사용하여 여러 행을 효율적으로 업데이트하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-30 19:39:10
원래의
849명이 탐색했습니다.

How to Efficiently Update Multiple Rows with NULL Values in PostgreSQL?

NULL 값으로 여러 행을 업데이트할 때의 문제

PostgreSQL에서 여러 행을 동시에 업데이트하면 NULL 값을 처리할 때 문제가 발생할 수 있습니다. 독립형 VALUES 표현식으로 작업할 때 PostgreSQL에는 데이터 유형에 대한 정보가 부족합니다. 결과적으로 NULL 값을 포함하여 숫자가 아닌 리터럴에는 명시적인 캐스팅이 필요합니다.

업데이트 쿼리에서 NULL 값 캐스팅

이 문제를 해결하려면 다음 해결 방법을 살펴보세요.

1. LIMIT 0을 사용한 하위 쿼리

UPDATE foo SET x=t.x, y=t.y FROM
(
  (SELECT pkid, x, y FROM foo LIMIT 0)
   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 및 SELECT

UPDATE foo SET x=t.x, y=t.y FROM
(
  (SELECT pkid, x, y FROM foo LIMIT 0)
   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;
로그인 후 복사
  • 장점: 유형 확인 실패 방지
  • 단점: 행당 자세한 구문, 긴 목록의 VALUES 표현식보다 느림

3. 열별 유형의 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.
...
로그인 후 복사
  • 장점: 일반적으로 #2보다 빠르며, 관련 열에 대한 짧은 구문, 관련 열 이름만 알아야 함
  • 단점: 장황한 구문 행이 적으면 가독성이 떨어집니다

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 표현식

...
FROM (
   VALUES
      ((NULL::foo).*)  -- decomposed row of values
    , (1, 20, NULL)    -- uniform syntax for all
    , (2, 50, NULL)
   ) t(pkid, x, y)  -- arbitrary column names (I made them match)
...
로그인 후 복사
  • 장단점은 #4와 유사하지만 더 일반적으로 알려진 구문을 사용합니다

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

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