如何引用 PostgreSQL 脚本中的值?

How to refer to a value in a PostgreSQL script?

我想使用最大值来提供序列的创建。例如,我正在获取最大 id 值,我想使用这个值:

DO $$
DECLARE   
    min_value Integer;
BEGIN
    SELECT MAX(tmp.id)+1 into min_value FROM tmp;
    -- raise notice 'Value: %', min_value;
    
    CREATE SEQUENCE id_seq_tmp
    INCREMENT 1
    START :tmp.min_value --Getting error: syntax error at or near ":"
    MINVALUE :tmp.min_value;
END $$;

如何引用最大值并传递给序列创建?我正在使用 psql (PostgreSQL) 13.3.

基本障碍是 DDL 命令(“实用程序语句”)根本不允许参数替换。您需要构建查询字符串并执行它。

通用 SQL

我建议 format() 完成任务:

DO
$do$
BEGIN
   EXECUTE format('
   CREATE SEQUENCE id_seq_tmp
   INCREMENT 1
   START %1$s
   MINVALUE %1$s'
 , (SELECT max(tmp.id)+1 FROM tmp));
END
$do$;

The manual:

Another restriction on parameter symbols is that they only work in SELECT, INSERT, UPDATE, and DELETE commands. In other statement types (generically called utility statements), you must insert values textually even if they are just data values.

参见:

从 psql 操作

从 psql 工作时,您可以使用 \gexec 直接执行动态构建的 DDL 语句:

SELECT format('CREATE SEQUENCE id_seq_tmp INCREMENT 1 START %1$s MINVALUE %1$s', max(big_id)+1) FROM b2\gexec

参见:

(无论哪种方式,如果 table tmp 可以为空,您需要做更多,因为 SELECT 查询为空。)