Redshift:如果不存在则添加列

问题描述 投票:0回答:3

以下适用于 Postgres 9.6,但不适用于 Redshift:

ALTER TABLE stats
    ADD COLUMN IF NOT EXISTS panel_exit timestamp;

Redshift 可以实现同样的功能吗?

sql amazon-redshift ddl
3个回答
14
投票

没有与

ADD COLUMN IF NOT EXISTS
等效的 Amazon Redshift 命令。

请参阅:ALTER TABLE 文档

要复制此功能,您的应用程序首先需要查询表元数据,然后决定是否发出

ADD COLUMN
命令。


4
投票

John 的回答为我指明了正确的方向,这是我发现在 Redshift 中检查列是否存在最有效的命令。

SELECT EXISTS(
    SELECT * FROM pg_table_def
    WHERE schemaname = '<my_schema_name>'
    and tablename = '<my_table_name>'
    and "column" = '<my_column_name>'
);

请注意,“column”周围需要双引号,因为

column
也是一个关键字。

此外,如果您感兴趣的表不在

public
模式中。您可能需要首先修改搜索路径,以便按预期返回结果:

set SEARCH_PATH to <schema_name>;

请参阅 PG_TABLE_DEF AWS 文档了解更多详细信息。


0
投票

经过多次尝试和错误,这是 Redshift 中添加不存在的新列的一种方法。

使用动态sql。请务必调整您的架构 - 我正在使用

workdb
。人们可以对此进行改进。

CREATE OR REPLACE PROCEDURE workdb.add_column_if_not_exists(
    p_schema_name VARCHAR(256),
    p_table_name VARCHAR(256),
    p_column_name VARCHAR(256),
    p_column_data_type VARCHAR(256)
)
AS $$


BEGIN
    -- Check if the column exists
   RAISE NOTICE '***New Column Info***: %', p_schema_name;
   RAISE NOTICE 'p_schema: %', p_schema_name;
   RAISE NOTICE 'p_table_name: %', p_table_name;
   RAISE NOTICE 'p_column_name: %', p_column_name;
   RAISE NOTICE 'p_column_data_type: %', p_column_data_type;          
          
    IF ( select
        count(*)  cnt   
        from INFORMATION_SCHEMA.COLUMNS
        where TABLE_SCHEMA = p_SCHEMA_NAME
            and TABLE_NAME = p_table_name
            and column_name = p_column_name
    ) = 0 THEN

          RAISE NOTICE 'Adding new column';
          EXECUTE 'ALTER TABLE ' || p_SCHEMA_NAME || '.' || p_table_name || ' ADD COLUMN ' || p_COLUMN_NAME || ' ' || p_COLUMN_DATA_TYPE;
          RAISE NOTICE 'New column Added';
    ELSE 
          RAISE NOTICE 'Column exists already';
    END IF;
   
END;

$$ LANGUAGE plpgsql
;

调用workdb.add_column_if_not_exists('workdb', 'test_table', 'new_col', 'int');

© www.soinside.com 2019 - 2024. All rights reserved.