PostgreSQL에서 NULL 값으로 여러 행을 업데이트하면 독립 실행형 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;
이전 방법과 유사하지만 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;
이 접근 방식은 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. ...
이 방법은 행 유형을 사용하여 열 유형을 암시적으로 정의합니다. 행은 테이블을 나타내는 행 유형으로 변환되며, 개별 열은 필드 선택을 통해 액세스할 수 있습니다.
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;
이전 방법과 유사하지만 표준 구문에서 분해된 행 값을 사용합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!