PostgreSQL 12
当我重命名表中的列时,我也想动态重命名匹配的检查约束。
我有一个假设的表格:
CREATE TABLE hypothetical_table (
id SERIAL PRIMARY KEY,
some_col text,
some_col_also text
);
有以下限制:
ALTER TABLE hypothetical_table ADD CONSTRAINT some_col_length_>_5 CHECK(char_length(some_col) > 5);
ALTER TABLE hypothetical_table ADD CONSTRAINT some_col_also_length_>_5 CHECK(char_length(some_col_also) > 5);
我不知道列可能有什么限制。我知道它们以列名为前缀。但是,就像some_col
上面的约束一样,该前缀可能与另一列的 ( some_col_also
) 匹配。
当我重命名此表中的列时,我也想重命名约束,以匹配新的列名。
那么,如果我要重命名some_col
,如何选择与该列关联的所有检查约束?
我尝试pg_catalog.pg_constraint
使用pg_catalog.pg_attribute
ON con.conkey = pga.attnum
(conkey
未嵌套)加入,但这会返回许多与该列无关的约束。
pg_constraint.conkey
是一个数组列,所以我们另外加入a.attnum = ANY(c.conkey)
关系的oid。喜欢:但我怀疑你的总体目标:
CHECK
在 Postgres 中,约束总是表约束,并且可以引用任意数量的表列。即使公式化为列约束!手册:所以
some_col
andsome_col_also
可以同时引用(多次)。两者都可以在约束名称中。除非您可以依赖严格的命名约定,否则我看不出一个完全动态的解决方案如何是防弹的。(你真的可以吗?)。以下是对some_col
or的引用some_col_also
吗?重写约束表达式本身也需要注意。