Postgresql 基于DO块内声明的变量创建部分索引
我有一个表,我希望在该表上有两个不同的部分唯一索引,根据表中另一列(外键)的值,在不同列上包含唯一约束。下面是一个例子:Postgresql 基于DO块内声明的变量创建部分索引,postgresql,plpgsql,Postgresql,Plpgsql,我有一个表,我希望在该表上有两个不同的部分唯一索引,根据表中另一列(外键)的值,在不同列上包含唯一约束。下面是一个例子: id | col1 | col2 | col3 | col4 ------------------------------ 1 | 3 | 4 | 'a' | 13 2 | 2 | 2 | 'b' | 431 3 | 3 | 4 | 'b' | 18 4 | 10 | 8 | 'b' | 211
id | col1 | col2 | col3 | col4
------------------------------
1 | 3 | 4 | 'a' | 13
2 | 2 | 2 | 'b' | 431
3 | 3 | 4 | 'b' | 18
4 | 10 | 8 | 'b' | 211
假设在这个表中,我想要:
- 在
col4=13或col4=18的所有行上放置部分索引,并对col1、col2和col3进行唯一约束
- 在
所在的所有行上放置部分索引,并对col1和col2进行唯一约束col413和col418
DO
$$
DECLARE
-- typical subquery
option1_id INTEGER := (SELECT id FROM option_table WHERE name = 'option1');
option2_id INTEGER := (SELECT id FROM option_table WHERE name = 'option2');
BEGIN
RAISE INFO '%, %', option1_id, option2_id;
-- option1
CREATE UNIQUE INDEX option1_index ON ex_table (col1, col2) WHERE (
col4 NOT IN (option1_id, option1_id)
);
-- option2
CREATE UNIQUE INDEX option2_index ON ex_table (col1, col2, col3) WHERE (
reference_type IN (option1_id, option2_id)
);
-- this works!
CREATE UNIQUE INDEX this_works ON ex_table (col1, col2, col3) WHERE (
reference_type IN (13, 18)
);
END
$$;
下面是我得到的错误:
错误:“option1\u id”列不存在
我知道变量的声明是正确的,因为
RAISE INFO
返回INFO:13、18
DDL语句不支持参数化-您不能在那里使用任何变量。您应该使用动态SQL(在这种情况下,不使用子句,使用
):
谢谢,这太好了。需要小的更改:
(%I,%I)
->(%L,%L)
,因为我们正在格式化一个整数而不是SQLname@mel-I固定占位符类型
EXECUTE format('CREATE UNIQUE INDEX ... WHERE reference_type IN (%L, %L)', option1_id, option2_id);