我定义了多个方案,在创建表时,我需要添加条件约束,即只有在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如果方案已经创建,那么约束将存在或不存在。如在本地,如果第一个方案项目未执行,则不会添加约束,如果第一个方案存在,则约束也将存在。
1条答案
按热度按时间ee7vknir1#
正如其他人所说,这是一个奇怪的请求,所以请检查您是否可以在尝试之前以其他方式建模您所需要的内容。
也就是说,实现这一点的一种方法是实现一个trigger,它将在INSERT和UPDATE时运行,并将检查information_schempa.tables作为其第一个条件。
目前我手头上没有运行pg11的程序,所以把这段代码当作一个触发器应该如何编写的想法。
如果您知道第一个表将在某个时间点添加并且永远不会删除,那么您可以使用相同的
information_schema.tables
select命令而不是触发器,只需执行ALTER TABLE
命令来添加check约束。如果可以删除表,但您知道这只会作为某种迁移来完成,那么您总是可以使用相同的检查来完成每个迁移,并相应地执行
[ADD | DROP] CONSTRAINT IF [NOT] EXISTS
。