如何在需要检查两列数据的表上编写自定义Postgresql约束?

a64a0gku  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(106)

我有一个表,我在其中Mapid到另一个id。该表大致如下所示:
| 识别码1|二号识别码|
| - -|- -|
| 一百二十三|二百三十四人|
| 三百四十五|四百五十六人|
| 五六七|六百七十八|
| 第001章|第001章|
我尝试添加的约束是,如果列id 2中已经存在一个id,则不允许将其输入到列id 1中。但有一个小的例外,即如果id 1 = id 2,则允许将其输入(请参见最后一行)。下面是我为它编写的约束(上面的表在函数中被引用为demo_table):

CREATE OR REPLACE FUNCTION public.chain_mapping_constraint(pid1 BIGINT, pid2 BIGINT)
RETURNS bool AS
$$

SELECT CASE WHEN pid1 = pid2 THEN TRUE
            WHEN (SELECT COUNT(t.*) FROM demo_table t WHERE t.id2 = pid1) > 0 THEN FALSE
            ELSE TRUE
       END;
$$  LANGUAGE sql STABLE

然后,在创建表后,我通过以下方式添加约束:

ALTER TABLE table ADD CONSTRAINT chain_mapping_constraint
CHECK (public.chain_mapping_constraint(id1, id2)) NOT VALID;

如果您一次插入一个记录,这是可行的,但是我发现一次插入多行查询会导致它失败。我认为它失败的原因是,即使我们可能违反了查询本身的条件,但该条件还没有在表中,因此它通过了。下面是我用来插入的导致约束失败的代码示例:

INSERT INTO demo_table(id1, id2)
SELECT id1, id2
FROM some_other_table

因此,当只有多行查询违反约束时,函数会在表中查找此问题,而不是查看查询本身,在表中看不到它,然后插入有问题的记录。
问题:
1.如何使约束考虑我插入的查询而不是表?
1.有没有更好的方法?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题