如何引用 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$;
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
参见:
- How to pass variable to PL/pgSQL code from the command line?
- Filter column names from existing table for SQL DDL statement
(无论哪种方式,如果 table tmp
可以为空,您需要做更多,因为 SELECT
查询为空。)
我想使用最大值来提供序列的创建。例如,我正在获取最大 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$;
Another restriction on parameter symbols is that they only work in
SELECT
,INSERT
,UPDATE
, andDELETE
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
参见:
- How to pass variable to PL/pgSQL code from the command line?
- Filter column names from existing table for SQL DDL statement
(无论哪种方式,如果 table tmp
可以为空,您需要做更多,因为 SELECT
查询为空。)