如果你的价值观确实是
UUID
兼容的,那么这样的事情是有效的:
create table foo(a varchar(64));
insert into foo(a) values('A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
alter table foo
alter column a type uuid using a::uuid;
所以在这种情况下你的脚本应该可以工作。它也适用于空值:
create table foo(a varchar(64));
insert into foo(a) values('A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11'), (null);
alter table foo
alter column a type uuid using a::uuid;
但对于无法转换为 uuid 的值,它本身不起作用:
create table foo(a varchar(64));
insert into foo(a) values('A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11'), ('b');
alter table foo
alter column a type uuid using a::uuid;
所以你有一些值无法转换为
uuid
。因此,我们需要确定一个值是否是正确的 uuid
,在这种情况下将其转换为 uuid
,否则默认为 null
:
create table foo(a varchar(64));
insert into foo(a) values('A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11'), ('b');
alter table foo
alter column a type uuid using case when a ~ E'^[[:xdigit:]]{8}-([[:xdigit:]]{4}-){3}[[:xdigit:]]{12}$' then a::uuid else null end;
很好,不是吗?
当然,建议您在执行此操作之前备份数据并仔细检查结果。