postgresql PostgresSQL中存在方案和表时的条件约束

xfb7svmp  于 2023-03-17  发布在  PostgreSQL
关注(0)|答案(1)|浏览(201)

我定义了多个方案,在创建表时,我需要添加条件约束,即只有在PostgresSQL中存在表和方案时才添加约束。下面是我正在尝试的代码片段,

CREATE TABLE second.second_table
(
id serial NOT NULL,
another_id integer NOT NULL,
some_column boolean NOT NULL,
CONSTRAINT other_pkey PRIMARY KEY (id),
CONSTRAINT fk_other_another_id FOREIGN KEY (another_id) REFERENCES first.first_table (id)
MATCH SIMPLE ## CHECK (TABLE IF EXISTS first.first_table) ##
)

条件部分我定义为'##',它只是一个例子,而不是正确的写作方式。所以,基本上只有当方案和表存在时才应该添加约束,否则就不存在。提前感谢。这里只是一个说明,如果与版本相关的东西,我使用的是'postgres:11.5-alpine'的PostgresSQL的Docker。
关于这个条件约束的概述是,在我们的项目中,我们有一个PostgresSQL,其中定义了多个方案。如上所述,一个方案与另一个方案之间存在某种关系。现在,在生产环境中,所有方案肯定都会存在,没有问题。但在做一些Junit测试用例时,如果你在本地做,一个方案可以存在或不存在。2只是为了有依赖性约束,我想使约束作为条件。3如果方案已经创建,那么约束将存在或不存在。如在本地,如果第一个方案项目未执行,则不会添加约束,如果第一个方案存在,则约束也将存在。

ee7vknir

ee7vknir1#

正如其他人所说,这是一个奇怪的请求,所以请检查您是否可以在尝试之前以其他方式建模您所需要的内容
也就是说,实现这一点的一种方法是实现一个trigger,它将在INSERT和UPDATE时运行,并将检查information_schempa.tables作为其第一个条件。
目前我手头上没有运行pg11的程序,所以把这段代码当作一个触发器应该如何编写的想法。

CREATE OR REPLACE FUNCTION check_condition_if_first_exists()
    RETURNS trigger AS
$BODY$  
    BEGIN
        IF NOT EXISTS (
            SELECT true
            FROM information_schema.tables 
            WHERE table_schema = 'first' AND table_name = 'first_table'
        ) THEN
            -- table does not exist
            RETURN NEW;
        END IF;

        IF (##) THEN -- your condition instead of ##
            -- condition satisfied
            RETURN NEW;
        END IF;

        RAISE EXCEPTION 'New row does not satisfy condition'
    END;
$BODY$
    LANGUAGE plpgsql;

CREATE TRIGGER on_upser_and_first_exists
    BEFORE INSERT OR UPDATE ON second.second_table
    FOR EACH ROW
    EXECUTE PROCEDURE check_condition_if_first_exists();

如果您知道第一个表将在某个时间点添加并且永远不会删除,那么您可以使用相同的information_schema.tables select命令而不是触发器,只需执行ALTER TABLE命令来添加check约束。
如果可以删除表,但您知道这只会作为某种迁移来完成,那么您总是可以使用相同的检查来完成每个迁移,并相应地执行[ADD | DROP] CONSTRAINT IF [NOT] EXISTS

相关问题