我有一个相当复杂的 Postgres 数据库,其中许多 UUID 字段被错误地存储为 VARCHAR。我想逐步迁移它们,但不幸的是,这样做打破了我的所有观点,因为 Postgres 没有内置的varchar = uuid
. 而是重写我的所有视图或尝试一次大规模迁移,我想临时创建一个 uuid = varchar 运算符,直到迁移完成。
我以前从未创建过自定义运算符,并且我在下面的尝试不起作用:
CREATE OR REPLACE FUNCTION uuid_equal_varchar (varchar, uuid)
RETURNS boolean AS 'SELECT $1::text = $2::text;' LANGUAGE sql IMMUTABLE;
CREATE OPERATOR = (
leftarg = character varying,
rightarg = uuid,
procedure = uuid_equal_varchar,
commutator = =
);
Run Code Online (Sandbox Code Playgroud)
然而,这个运营商打破了一切。包括一个简单的 varchar = varchar 比较(见下文):
SELECT * FROM test WHERE pk_test = '123';
ERROR: invalid input syntax for uuid: "123"
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释我做错了什么吗?我是否试图尝试不可能的事情?