将postgresql中的列值从文本转换为smallint会引发错误

问题描述 投票:0回答:1

如您所见,这里唯一抛出错误的列是 user_uuid

我希望它具有数据类型 uuid。之前加载数据之前,它是 python 中的对象类型。

postgresql sqldatatypes
1个回答
0
投票

如果你的价值观确实是

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;

很好,不是吗?

当然,建议您在执行此操作之前备份数据并仔细检查结果。

© www.soinside.com 2019 - 2024. All rights reserved.