enum을 문자열로 불변으로 변환
Oct 04 2020
PostgreSQL에서 열거 형 값을 문자열로 변환하는 일반적인 방법은이를 캐스트 (사용 ::text)하거나 단순히 다른 문자열에 연결할 때 암시 적 변환에 의존하는 것입니다.
testdb=# CREATE TYPE color AS ENUM ('red', 'green', 'blue');
CREATE TYPE
testdb=# CREATE TABLE object (id serial, name text, color color);
CREATE TABLE
testdb=# INSERT INTO object (name, color) VALUES ('table', 'red'), ('chair', 'green');
INSERT 0 2
testdb=# SELECT name || color FROM object;
?column?
------------
tablered
chairgreen
(2 rows)
그러나 한 가지 문제가 있습니다. 이러한 변환은 Postgres에 의해 불변 으로 간주되지 않는 것 같습니다 . 결과적으로 GENERATED열 정의와 같이 변경 불가능한 표현식이 예상되는 위치에서 사용하려고하면 오류가 발생합니다 .
testdb=# ALTER TABLE object ADD COLUMN namecolor text GENERATED ALWAYS AS (name || color) STORED;
ERROR: generation expression is not immutable
testdb=# ALTER TABLE object ADD COLUMN colorastext text GENERATED ALWAYS AS (color::text) STORED;
ERROR: generation expression is not immutable
이것은 직관적이지 않은 것 같고 계산 된 열의 문자열에 열거 형 값을 연결할 수 있기를 원하기 때문에 불편합니다.
따라서 두 가지 질문이 있습니다.
- Postgres는 왜 열거 형을 불변이 아닌 문자열로 변환하는 것을 고려합니까? 이 동작이 버그입니까?
- Postgres가 그러한 변환을 변경할 수 없다고 설득 할 수있는 해결 방법이 있습니까 (주의해야 할 위험이 있습니까)?
답변
2 LaurenzAlbe Oct 05 2020 at 12:46
열거 형 항목의 이름을 바꿀 수 있으므로 캐스트는
IMMUTABLE.열거 형 값의 이름을 바꾸지 않을 것이라고 확신하는 경우 내부적으로 캐스트를 사용하는 자체 변환 함수를 작성하고 함수에 레이블을 지정하십시오
IMMUTABLE. 그러면 PostgreSQL이 해당 레이블을 신뢰하며 약속을 이행하는 것은 사용자에게 달려 있습니다.