PostgreSQL 仅当列存在时才重命名该列

s.k*_*s.k 4 postgresql rename

我在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
Run Code Online (Sandbox Code Playgroud)

(与此同时,我将与团队澄清事情,因此,如果这样的命令不存在,那也没什么大不了的,但我认为它会有所帮助)。

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

完全符合您的要求。在该部分中输入表名称和列名称DECLARE
NOTICE可选的。
为了重复使用,我将创建一个函数并传递参数而不是变量。

变量被安全处理(无 SQL 注入)。表名可以选择是模式限定的。如果不是,则按照 current 解决search_path,就像ALTER TABLE会一样。

有关的: