代码之家  ›  专栏  ›  技术社区  ›  Richi

更改id列的数据类型

  •  0
  • Richi  · 技术社区  · 2 年前

    我正在尝试更新 id 列来自 public.profiles 内的表 supabase 。我一直在运行此命令:

    ALTER TABLE public.profiles
    ALTER COLUMN id type uuid_generate_v4();
    

    然后运行 supabase db reset 查看本地数据库中的更改,但向我发回错误

    Error: ERROR: identity column type must be smallint, integer, or bigint (SQLSTATE 22023)
    At statement 0: ALTER TABLE public.profiles       
    ALTER COLUMN id set data type uuid
    
    

    在本地数据库中 supabase 我已经激活了分机 uuid-ossp

    1 回复  |  直到 2 年前
        1
  •  2
  •   Erwin Brandstetter    2 年前

    你必须先 drop the IDENTITY attribute 从列中删除。
    然后将数据类型更改为 uuid ,提供来自 int -> uuid 。我选择了 md5(id::text)::uuid 。请参阅:

    然后将默认值设置为 uuid_generate_v4() -附加模块 "uuid-ossp" 显然,必须为此安装。

    DROP IDENTITY 必须先去。剩下的可以在一个命令中完成。最好在一笔交易中完成所有操作。

    ALTER TABLE profiles ALTER COLUMN id DROP IDENTITY IF EXISTS;
    
    ALTER TABLE profiles
      ALTER COLUMN id type uuid USING md5(id::text)::uuid
    , ALTER COLUMN id SET DEFAULT uuid_generate_v4();
    

    fiddle

    重写整个表格。所以你可能想跑步 VACUUM FULL ANALYZE 之后去除肿胀(并清理其他东西)。

    如果 id 也是PK,它是自动调整的。 或者,放下该列 id 并添加一个新的。对于大桌子来说会更便宜。不过,新列会附加在表的末尾。

    或者创建表的副本,切换出 id 列。如果你能负担得起的话。