PostgreSQL如果存在就重命名列。

4

PostgreSQL文档中,我找不到一种方法可以运行这样的语句:ALTER TABLE tablename RENAME COLUMN IF EXISTS colname TO newcolname;

我希望我们可以实现这个功能,因为我遇到了一个错误,这取决于谁制作并提供给我一个SQL脚本,在某些情况下一切都很完美(当列名称错误时,使用RENAME语句会更改名称),而在其他情况下不完美(当列已经有正确的名称时)。

因此,我的想法是在尝试重命名列时使用IF EXISTS语句来检查列名。如果列已经具有正确的名称(这里是cust_date_mean),那么必须应用的重命名命令只能跳过错误的名称,而不发出以下错误:

db_1   | [223] ERROR: column "cust_mean" does not exist
db_1   | [223] STATEMENT: ALTER TABLE tablename RENAME COLUMN cust_mean TO cust_date_mean;
db_1   | ERROR:  column "cust_mean" does not exist

(与此同时,我将与团队澄清事情,因此,如果不存在这样的命令,也不是大问题,但我认为它可能会有所帮助。)


1
你尝试过从这个来源获取的答案吗? - Modar Na
1
这是一个功能请求,不是在SO上可以实现的东西。如果您想提出建议,则适当的地方是其中之一Postgres邮件列表,--general或--hackers。只需注意当前的Postgres开发版本14已经进入了功能冻结阶段。假设有人会接受这个提案,最早实施它的时间将是版本15,即1年以上。 - Adrian Klaver
需要特别使用“RENAME”吗?其他数据库对象是否依赖于该列?请注意,“ADD”和“DROP”带有“IF [NOT] EXISTS”选项,因此您可能可以将其用作解决方法。 - Bergi
1
@Bergi,问题在于需要想出一种机制,以便保留删除列中的值,以便恢复到添加列中。 - Adrian Klaver
@AdrianKlaver 啊,对了,那需要一条“更新”语句,在那种情况下你也不知道是否应该执行它… - Bergi
1个回答

5

虽然没有内置功能,但可以使用DO语句:

DO
$$
DECLARE
   _tbl         regclass := 'public.tbl';      -- not case sensitive unless double-quoted
   _colname     name     := 'cust_mean';       -- exact, case sensitive, no double-quoting
   _new_colname text     := 'cust_date_mean';  -- exact, case sensitive, no double-quoting
BEGIN
   IF EXISTS (SELECT FROM pg_attribute
              WHERE  attrelid = _tbl
              AND    attname  = _colname
              AND    attnum > 0
              AND    NOT attisdropped) THEN
      EXECUTE format('ALTER TABLE %s RENAME COLUMN %I TO %I', _tbl, _colname, _new_colname);
   ELSE
      RAISE NOTICE 'Column % of table % not found!', quote_ident(_colname), _tbl;
   END IF;
END
$$;

这个功能完全按照你的要求执行。在 DECLARE 部分输入表名和列名。
NOTICE 是可选的。
如果需要重复使用,建议创建一个函数并传递参数,而不是变量。

变量安全处理(没有 SQL 注入)。表名可以选择性地包含模式限定符。如果没有模式限定符,它将根据当前的 search_path 解析,就像执行 ALTER TABLE 一样。

相关:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接