是否可以在 PostgreSQL 中从一个枚举转换为另一个枚举
Is it possible to cast from one enum to another in PostgreSQL
我需要根据现有模式在第二个模式中填充新的 table,但在将“schema1.a.disclosure_level”列枚举转换为“schema2.b.disclosure_level”枚举时遇到问题。通过 ::text 或 :: varchar 进行强制转换没有帮助。转换为 ::schema1.a.disclosure_level 会引发跨数据库引用错误。
INSERT INTO schema1.a (id, disclosure_level)
SELECT schema2.b.id, schema2.b.disclosure_level
FROM schema2.b;
有什么想法吗?
从这里开始:
https://www.postgresql.org/docs/current/datatype-enum.html
8.7.3. Type Safety
Each enumerated data type is separate and cannot be compared with other enumerated types.
示例:
CREATE TYPE animal AS ENUM ('dog', 'cat', 'rabbit');
CREATE TYPE animal_2 AS ENUM ('dog', 'cat', 'rabbit');
create table enum_test(id integer, a animal, a2 animal_2);
insert into enum_test values (1, 'dog', 'cat');
select a::animal from enum_test ;
a
-----
dog
select a::animal_2 from enum_test ;
ERROR: cannot cast type animal to animal_2
LINE 1: select a::animal_2 from enum_test ;
所以答案是否定的,您不能将一个枚举转换为另一个枚举。
@Bergi 向我展示了解决方案。
INSERT INTO schema1.a (id, disclosure_level)
SELECT schema2.b.id, schema2.b.disclosure_level::text:schema1.disclosure_level_enum
FROM schema2.b;
我的错误是在转换中使用列名而不是枚举类型定义:schema1.disclosure_level_enum
(类型)而不是 schema1.a.disclosure_level
(列)!
我需要根据现有模式在第二个模式中填充新的 table,但在将“schema1.a.disclosure_level”列枚举转换为“schema2.b.disclosure_level”枚举时遇到问题。通过 ::text 或 :: varchar 进行强制转换没有帮助。转换为 ::schema1.a.disclosure_level 会引发跨数据库引用错误。
INSERT INTO schema1.a (id, disclosure_level)
SELECT schema2.b.id, schema2.b.disclosure_level
FROM schema2.b;
有什么想法吗?
从这里开始:
https://www.postgresql.org/docs/current/datatype-enum.html
8.7.3. Type Safety
Each enumerated data type is separate and cannot be compared with other enumerated types.
示例:
CREATE TYPE animal AS ENUM ('dog', 'cat', 'rabbit');
CREATE TYPE animal_2 AS ENUM ('dog', 'cat', 'rabbit');
create table enum_test(id integer, a animal, a2 animal_2);
insert into enum_test values (1, 'dog', 'cat');
select a::animal from enum_test ;
a
-----
dog
select a::animal_2 from enum_test ;
ERROR: cannot cast type animal to animal_2
LINE 1: select a::animal_2 from enum_test ;
所以答案是否定的,您不能将一个枚举转换为另一个枚举。
@Bergi 向我展示了解决方案。
INSERT INTO schema1.a (id, disclosure_level)
SELECT schema2.b.id, schema2.b.disclosure_level::text:schema1.disclosure_level_enum
FROM schema2.b;
我的错误是在转换中使用列名而不是枚举类型定义:schema1.disclosure_level_enum
(类型)而不是 schema1.a.disclosure_level
(列)!