仅在存在时重命名列

Nes*_*ird 8 postgresql

PostgreSQL不允许

ALTER TABLE t RENAME COLUMN IF EXISTS c1 TO c2
Run Code Online (Sandbox Code Playgroud)

...或类似的东西。但是,能够编写修改DB结构的脚本非常方便,该脚本可以再次运行而无需先检查它是否已经运行。

我该如何编写PostgreSQL函数来做到这一点?

Nik*_*iya 19

请阅读这篇文章以获得详细的解释。

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 $$;
Run Code Online (Sandbox Code Playgroud)


Ste*_*oni 18

您可以简单地处理匿名代码块中可能引发的错误:

DO
$$
    BEGIN
        ALTER TABLE t
            RENAME COLUMN c1 TO c2;
    EXCEPTION
        WHEN undefined_column THEN RAISE NOTICE 'column t.c1 does not exist';
    END;
$$;
Run Code Online (Sandbox Code Playgroud)

您可以省略 THEN 之后的文本而不执行任何操作:

DO
$$
    BEGIN
        ALTER TABLE t
            RENAME COLUMN c1 TO c2;
    EXCEPTION
        WHEN undefined_column THEN
     END;
$$;
Run Code Online (Sandbox Code Playgroud)

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