【问题标题】:Postgres flyway create concurrently index errorPostgres flyway 创建并发索引错误
【发布时间】:2021-09-05 06:06:50
【问题描述】:

我想做这样的事情:

CREATE OR REPLACE FUNCTION __column_exists(TEXT, TEXT, TEXT) RETURNS bool as $$
SELECT exists(SELECT 1 FROM information_schema.columns WHERE (table_schema, table_name, column_name) = ($1, $2, $3));
$$ language sql STRICT;

DO $$ BEGIN IF __column_exists('public', 'table_name', 'column_name') THEN
CREATE INDEX CONCURRENTLY IF NOT EXISTS column_idx ON table_name USING btree (column_name);
END IF; END; $$;

但是有

错误:CREATE INDEX CONCURRENTLY 不能在事务块内运行

如果我只写它就可以了

CREATE INDEX CONCURRENTLY IF NOT EXISTS column_idx ON table_name USING btree (column_name);

如何保留列存在的条件?

飞路4.2.0;

【问题讨论】:

  • IIRC,你需要使用两个单独的脚本(即CREATE INDEX CONCURRENTLY必须在一个脚本中单独存在,否则Flyway在没有事务的情况下无法运行)

标签: java postgresql flyway postgresql-9.2


【解决方案1】:

你为什么使用这么旧版本的 flyway ? 你应该先升级你的flyway版本,然后:

为您的脚本创建一个配置文件,例如 V01_001__my_script.sql.conf 其中 V01_001__my_script.sql 是您的 sql 文件的名称。

并将这一行放在里面:

executeInTransaction=false

这将禁用此脚本在事务中的执行。

【讨论】:

  • 有很多旧的遗留代码)当我开始更新版本时,它导致了一连串的错误。明天我会尝试你的建议)
  • 有新问题)Postgres 不能在非事务模式下运行函数和过程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多