PG 14.11
这非常有效:
CDSLBXW=# \set sch public
CDSLBXW=# \set tbl job_history
CDSLBXW=# \set fld job_id
CDSLBXW=# CREATE INDEX CONCURRENTLY IF NOT EXISTS blarge ON :sch.:tbl (:fld) WITH (fillfactor=100);
CREATE INDEX
但是,我不想要名为“blarge”的索引。目标是从表和字段名称构建有意义的索引名称,但下划线会导致它失败:
CDSLBXW=# CREATE INDEX CONCURRENTLY IF NOT EXISTS tmpidx_:tbl_:fld ON :sch.:tbl (:fld) WITH (fillfactor=100);
ERROR: syntax error at or near ":"
LINE 1: CREATE INDEX CONCURRENTLY IF NOT EXISTS tmpidx_:tbl_job_id O...
^
在 bash 中,您可以使用大括号来分隔变量名称,但这些在 psql 中不可用。
该怎么办?
在这种情况下,您可以借助PL/pgSQL来动态生成SQL语句。
您可以使用以下代码 `--设置变量 \设置 sch 公共 \set tbl job_history \设置 fld job_id
-- 使用变量创建索引 做$$ 开始 执行格式('如果不存在则并发创建索引 %I ON %I.%I (%I) WITH (fillfactor=100);', :sch || '' || :tbl || '' || : fld || '_idx',:sch,:tbl,:fld); 结束 $$; ` 根据您的需要调整变量。