即使在使用 'IF EXISTS-THEN' pgsql 块时如何修复 "relation <table_name> does not exist" 错误?
How to fix "relation <table_name> does not exist" ERROR even when using 'IF EXISTS-THEN' pgsql block?
我们正在使用带有 Spring-Boot .sql 文件的 Postgres 13.0 版本作为初始步骤。
我需要 运行 更新脚本,但前提是 table 本身已经存在。
在努力理解什么是正确的语法之后,我使用了以下脚本:
ALTER TABLE IF EXISTS ONLY scm_repos ADD COLUMN IF NOT EXISTS token_id BIGINT;
DO '
BEGIN
IF EXISTS
(SELECT 1 FROM scm_repos WHERE id = 1)
THEN
UPDATE scm_repos repos SET token_id=(SELECT token_id FROM scm_orgs orgs WHERE repos.org_id=orgs.id);
END IF ;
END;
' ;
我的意图很简单 - 仅当 scm_repos
table 确实存在时才 运行 UPDATE 脚本,但无论我尝试什么,我仍然收到以下错误:
Failed to execute SQL script statement #5 of URL [jar:file:/app/cx-integrations-datastore.jar!/BOOT-INF/classes!/schema.sql]: DO '
BEGIN
IF EXISTS
(SELECT 1 FROM scm_repos WHERE id = 1)
THEN
UPDATE scm_repos repos SET token_id=(SELECT token_id FROM scm_orgs orgs WHERE repos.org_id=orgs.id);
END IF ;
END;
' ; nested exception is org.********ql.util.PSQLException: ERROR: relation "scm_repos" does not exist
Where: PL/pgSQL function inline_code_block line 3 at IF
我在这里错过了什么?
13.0 有已知的未修复错误。 13.4 是 13 的最新版本。运行 旧的次要版本几乎没有充分的理由。这似乎与这里无关。
但是您在这里缺少的是,在顶层,EXISTS 检查是否有 SELECT returns 任何行。它不检查 SELECT 的 FROM 列表中提到的 table 是否存在,它假设它们存在。
您可以更改查询,使其查询目录以查看 table 是否存在,例如:
IF EXISTS
(SELECT 1 FROM pg_class where relname=$J$scm_repos$J$)
...
我们正在使用带有 Spring-Boot .sql 文件的 Postgres 13.0 版本作为初始步骤。
我需要 运行 更新脚本,但前提是 table 本身已经存在。
在努力理解什么是正确的语法之后,我使用了以下脚本:
ALTER TABLE IF EXISTS ONLY scm_repos ADD COLUMN IF NOT EXISTS token_id BIGINT;
DO '
BEGIN
IF EXISTS
(SELECT 1 FROM scm_repos WHERE id = 1)
THEN
UPDATE scm_repos repos SET token_id=(SELECT token_id FROM scm_orgs orgs WHERE repos.org_id=orgs.id);
END IF ;
END;
' ;
我的意图很简单 - 仅当 scm_repos
table 确实存在时才 运行 UPDATE 脚本,但无论我尝试什么,我仍然收到以下错误:
Failed to execute SQL script statement #5 of URL [jar:file:/app/cx-integrations-datastore.jar!/BOOT-INF/classes!/schema.sql]: DO '
BEGIN
IF EXISTS
(SELECT 1 FROM scm_repos WHERE id = 1)
THEN
UPDATE scm_repos repos SET token_id=(SELECT token_id FROM scm_orgs orgs WHERE repos.org_id=orgs.id);
END IF ;
END;
' ; nested exception is org.********ql.util.PSQLException: ERROR: relation "scm_repos" does not exist
Where: PL/pgSQL function inline_code_block line 3 at IF
我在这里错过了什么?
13.0 有已知的未修复错误。 13.4 是 13 的最新版本。运行 旧的次要版本几乎没有充分的理由。这似乎与这里无关。
但是您在这里缺少的是,在顶层,EXISTS 检查是否有 SELECT returns 任何行。它不检查 SELECT 的 FROM 列表中提到的 table 是否存在,它假设它们存在。
您可以更改查询,使其查询目录以查看 table 是否存在,例如:
IF EXISTS
(SELECT 1 FROM pg_class where relname=$J$scm_repos$J$)
...