Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 仅当存在时重命名列_Postgresql_Ddl_Alter Table - Fatal编程技术网

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

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$
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;
$$;