作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 PostgreSQL documentation 中找不到如果有办法运行:ALTER TABLE tablename RENAME COLUMN IF EXISTS colname TO newcolname;
语句。
我很高兴我们可以,因为我面临的错误取决于谁制作并给我一个 SQL 脚本,在某些情况下一切都很好(当列名错误时,名称将实际上可以使用 RENAME
语句进行更改),而在其他情况下则不会(当列已经具有正确的名称时)。
因此产生了在尝试重命名列 name 时使用 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
(与此同时,我会与团队澄清事情,因此如果不存在这样的命令也没什么大不了的,但我认为它可能会有所帮助)。
最佳答案
虽然没有内置功能,但您可以使用 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 注入(inject))。表名可以选择是模式限定的。如果不是,则根据当前 search_path
进行解析,就像 ALTER TABLE
一样。
相关:
关于PostgreSQL 仅在列存在时重命名该列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68247752/
我是一名优秀的程序员,十分优秀!