以下适用于 Postgres 9.6,但不适用于 Redshift:
ALTER TABLE stats
ADD COLUMN IF NOT EXISTS panel_exit timestamp;
Redshift 可以实现同样的功能吗?
没有与
ADD COLUMN IF NOT EXISTS
等效的 Amazon Redshift 命令。
请参阅:ALTER TABLE 文档
要复制此功能,您的应用程序首先需要查询表元数据,然后决定是否发出
ADD COLUMN
命令。
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 文档了解更多详细信息。
经过多次尝试和错误,这是 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');