PostgreSQL:仅在存在时重命名列

时间:2018-01-04 19:33:29

标签: postgresql

PostgreSQL不允许 ALTER TABLE t RENAME COLUMN IF EXISTS c1 TO c2

......或类似的东西。但是,能够编写修改DB结构的脚本非常方便,可以在不首先检查它是否已经运行的情况下再次运行。

如何编写PostGreSQL函数才能完成此操作?

4 个答案:

答案 0 :(得分:2)

HI尝试此解决方案。

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

答案 1 :(得分:1)

最好有两个函数,一个调用另一个:

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;

答案 2 :(得分:0)

@NessBird 2函数方法很好,但是可以将Column_Exists函数简化为一个select存在,避免计数,并可以将其作为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参数以处理具有相同表名的多个模式。 除了可能添加模式之外,rename_column_if_exists保持不变。

答案 3 :(得分:0)

您可以简单地处理可能在 anonymous code block 中引发的错误:

DO
$$
    BEGIN
        ALTER TABLE t
            RENAME COLUMN c1 TO c2;
    EXCEPTION
        WHEN undefined_column THEN RAISE NOTICE 'column t.c1 does not exist';
    END;
$$;

你可以省略THEN后面的文字,什么都不做:

DO
$$
    BEGIN
        ALTER TABLE t
            RENAME COLUMN c1 TO c2;
    EXCEPTION
        WHEN undefined_column THEN
     END;
$$;

您可能只会在错误发生时得到一个数字。您可以从 here 中找到条件名称(WHEN 后面的错误名称)。确保您的数据库版本正确。