检查列是否存在并使用 Vertica 删除

Check if Column Exists and drop using Vertica

f我们有一个 HP Vertica 数据库,我正在编写一些最终将部署在 GIT 中的脚本,以更改我的维度模型。作为前几行一般内务管理的一部分,我将有一些代码将删除脚本中正在修改的元素,这些元素看起来非常直接。

这是我正在使用的那种东西的例子,它很有效。

DROP CONSTRAINT if exists fk_fctClick_Money_SourceKey


DROP TABLE if exists SCHEMA.dimSourceType

在检查列是否存在时,我对如何实现这段代码有点困惑。在大多数其他数据库中似乎很简单,但我找不到任何关于如何在 Vertica 中执行此操作的信息。

我知道在 PostgreSQL 中它看起来有点像这样:

ALTER TABLE SCHEMA.dimSourceTypeS DROP COLUMN IF EXISTS SourceKey;

这不起作用,因为错误提示单词 "EXISTS" 附近有错误。 MSSQL 对应项也不起作用。

谁能帮我解答这个问题?

您不能使用 "IF EXISTS",因为它不受支持。请参阅 doc here

您可以遍历感兴趣的 table 列或每个 table 和 运行 仅在现有列上更改 table。

使用您最喜欢的语言,如下所示:

for a given table
   set_of_existing_cols = get("SELECT COLUMN_NAME FROM columns WHERE table_name = <YOUR_TABLE>")
   set_of_delete_columns = set_of_existing_columns intersect set_of_columns_you_want_to_delete
   for each column from set_of_delete_colmn
      run("ALTER TABLE <YOUR_TABLE> DROP COLUMN column")

您可以使用此查询从该架构的所有表中获取所有列名称:

select table_schema,table_name,column_name,data_type from v_catalog.columns where select table_schema,table_name,column_name,data_type from v_catalog.columns limit 1 like '%table_name% ;

来自此查询的结果,通常是列表 [[a,b,c,int]] 然后你可以抬头看看那个col是否存在。

掉落:

alter table table_name drop column col_name;