【发布时间】:2021-05-16 16:28:40
【问题描述】:
我目前正在清理我们应用程序中的一些表,我们在一些表中定义了一些 JSONb,它们的值只是给定键的 true 或 false。看到这一点,我想摆脱 jsonb,取而代之的是一个 enum 数组,我可以在其中获取我的 jsonb 以前的键(其值为 true)
例如,我想改造这张桌子
CREATE TABLE my_table (
...
my_field JSONB
...
);
到
CREATE TYPE field_enum AS ENUM (
'key1',
'key2',
'key3',
'key4',
'key5',
'key6'
);
CREATE TABLE my_table (
...
my_field field_enum[] DEFAULT NULL,
...
);
我希望从中迁移数据(对于此示例)
{"key1": true, "key2": null, "key3": false, "key4": true}
到
['key1','key4']
我正在尝试通过一个独特的命令进行数据迁移来改变我的列类型,我认为这可能是:
ALTER TABLE
my_table
ALTER COLUMN
my_field
TYPE
field_enum
USING __XXXXXX___;
using 部分是我遇到困难的地方,有人知道我应该如何在不丢失数据的情况下更改我的列吗?
我也愿意创建一个新字段并在此之后重命名它,然后在表上使用 UPDATE。
我正在考虑使用jsonb_object_keys 函数,但它首先给了我所有的键,而不仅仅是那些值为真的键,它还给了我一个我无法将其转换为枚举的记录 [] []。
更深入,但这对我来说不是强制性的,因为我可以将其作为后处理,可能会发生 json 键必须链接到一个不相同的枚举键,假设 @ 987654330@ 应转换为 NEW_KEY(大写和名称更改)。你认为可以包含在同一个 postgresql 命令中吗?
如果你们中的任何人知道我能做什么,我将不胜感激。
谢谢!
X.
【问题讨论】:
-
你为什么不完全展开它并只拥有 6 个布尔列?查询此类标志会更容易。
-
我想过这个想法,但考虑到我的桌子上有 6 个 JSONB,JSONB 有大约 10 个键,假设我们有一个反应下拉组件,可以轻松地将 ENUM 列表作为输入,它是在我的表上有 6 个 ENUM[] 字段而不是 60 个字段,非常方便且易读。
标签: database postgresql enums jsonb