Postgresql 仅当存在时重命名列
PostgreSQL不允许Postgresql 仅当存在时重命名列,postgresql,ddl,alter-table,Postgresql,Ddl,Alter Table,PostgreSQL不允许 ALTER TABLE t RENAME COLUMN IF EXISTS c1 TO c2 …或诸如此类的事情。但是,编写修改DB结构的脚本非常方便,可以在不检查是否已经运行的情况下再次运行 如何编写PostgreSQL函数来实现这一点?最好有两个函数,一个调用另一个: CREATE OR REPLACE FUNCTION column_exists(ptable TEXT, pcolumn TEXT) RETURNS BOOLEAN AS $BODY$ DE
ALTER TABLE t RENAME COLUMN IF EXISTS c1 TO c2
…或诸如此类的事情。但是,编写修改DB结构的脚本非常方便,可以在不检查是否已经运行的情况下再次运行
如何编写PostgreSQL函数来实现这一点?最好有两个函数,一个调用另一个:
CREATE OR REPLACE FUNCTION column_exists(ptable TEXT, pcolumn TEXT)
RETURNS BOOLEAN AS $BODY$
DECLARE result bool;
BEGIN
-- Does the requested column exist?
SELECT COUNT(*) INTO result
FROM information_schema.columns
WHERE
table_name = ptable and
column_name = pcolumn;
RETURN result;
END$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION rename_column_if_exists(ptable TEXT, pcolumn TEXT, new_name TEXT)
RETURNS VOID AS $BODY$
BEGIN
-- Rename the column if it exists.
IF column_exists(ptable, pcolumn) THEN
EXECUTE FORMAT('ALTER TABLE %I RENAME COLUMN %I TO %I;',
ptable, pcolumn, new_name);
END IF;
END$BODY$
LANGUAGE plpgsql VOLATILE;
@NessBird 2函数方法很好,但列_Exists函数可以简化为select Exists,避免计数,并作为SQL函数而不是plpgsql函数
create or replace function
column_exists(ptable text, pcolumn text, pschema text default 'public')
returns boolean
language sql stable strict
as $body$
-- does the requested table.column exist in schema?
select exists
( select null
from information_schema.columns
where table_name=ptable
and column_name=pcolumn
and table_schema=pschema
);
$body$;
我添加了schema参数来处理具有相同表名的多个schema。
“重命名”列(如果存在)保持不变,但可能添加的架构除外。请阅读此列以获取详细解释
DO $$
BEGIN
IF EXISTS(SELECT *
FROM information_schema.columns
WHERE table_name='your_table' and column_name='your_column')
THEN
ALTER TABLE "public"."your_table" RENAME COLUMN "your_column" TO "your_new_column";
END IF;
END $$;
您可以简单地处理以下情况中可能出现的错误: 之后,您可以省略文本而不执行任何操作:
DO
$$
BEGIN
ALTER TABLE t
RENAME COLUMN c1 TO c2;
EXCEPTION
WHEN undefined_column THEN
END;
$$;
您可能只会在错误发生时获得一个数字。您可以从中找到条件名称(时间后的错误名称)。确保您的数据库版本正确。plpgsql函数如何先检查信息\u架构,然后执行动态查询重命名列?谢谢您的提问。如何将需求发送给PostgreSQL构建器?这很好,很整洁…也许我会将其作为函数编写并使用。@NessBird如果您得到了解决方案,请接受这个答案好吗?所以其他人可以检查接受的答案并快速得到解决方案。您不需要返回语句吗?不需要。请参阅语言规范-“SQL”。最后一条语句是SQL函数,它必须是带有returning子句的select或DML语句。它返回语句的结果。仔细想想,我不认为SQL函数可以有返回,但不是100%确定。
DO
$$
BEGIN
ALTER TABLE t
RENAME COLUMN c1 TO c2;
EXCEPTION
WHEN undefined_column THEN
END;
$$;