0

我需要将列的类型从 更改varchar(255)uuid。我在用:

ALTER TABLE table_name
    ALTER COLUMN col TYPE UUID USING col::UUID;

但是,如果该列中有一些不是 uuid 格式的值,我将收到此错误: SQL Error [22P02]: ERROR: invalid input syntax for type uuid: "some_text"

是否可以删除那些具有无法转换为 uuid 的值的行?

4

1 回答 1

1

使用@JuliusTuskenis 建议的 uuid_or_null函数,您可以简单地执行此操作:

ALTER TABLE table_name ALTER COLUMN col TYPE UUID USING uuid_or_null(col);
delete from table_name where col is null;

您必须在此之前定义函数。

create function uuid_or_null(s text) returns uuid immutable AS
$$
begin
  return s::uuid;
exception when others then
  return null;
end;
$$ language plpgsql;

构建的方式uuid_or_null非常通用,或多或少是一种安全铸造的模式 - 尝试铸造,如果它爆炸然后做出相应的反应。有几个 SO 线程在使用它。

您还可以预先清理表格,然后像这样更改列类型:

delete from table_name 
 where col !~* '^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$';
ALTER TABLE table_name ALTER COLUMN col TYPE UUID USING col::UUID;
于 2021-10-13T07:26:33.897 回答