I'm trying to update the data type of the id
column from public.profiles
table within supabase
. i've been running this command:
ALTER TABLE public.profiles
ALTER COLUMN id type uuid_generate_v4();
then run supabase db reset
to see the changes in local db but send me back an error
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
In local db with supabase
i have activated the extension uuid-ossp
You must first drop the IDENTITY
attribute from the column.
Then change the data type to uuid
, providing a translation expression from int
-> uuid
. I chose md5(id::text)::uuid
. See:
Then set the default to uuid_generate_v4()
- the additional module "uuid-ossp"
must be installed for that, obviously.
DROP IDENTITY
must go first. The rest can be done in a single command. Best do it all in a single transaction.
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();
Rewrites the whole table. So you may want to run VACUUM FULL ANALYZE
to remove bloat afterwards (and clean up other stuff).
If id
is also the PK, that's adapted automatically.
Alternatively, drop the column id
and add a new one. Would be cheaper for big tables. The new column is appended at the end of the table, though.
Or create a copy of the table, switching out the id
column in the process. If you can afford that.