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进行唯一约束
  • col413和col418
    所在的所有行上放置部分索引,并对col1和col2进行唯一约束
问题是我想根据另一个表中的列的值来执行此操作,因为col4是一个外键。问了一个类似的问题,但实际上没有解决办法。以下是我使用pl/pgsql所做的工作:

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);