Redshift 更改表(如果不存在)

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

我正在尝试在红移表中添加一个新字段。但我只想在该字段不存在时添加。 我尝试用 IF NOT EXISTS 包装它。但我收到以下错误: Amazon](500310) 无效操作:“IF”位置或附近的语法错误:5;

BEGIN
  IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'schema_name' and table_name='table_name' and column_name='new_field') THEN 
    ALTER TABLE schema_name.table_name
    ADD new_field INT;
  END IF;

COMMIT;

我不确定我是否在 BEGIN 块中正确使用了“IF NOT EXISTS”语句。 有人可以帮我吗?

提前致谢!

sql amazon-web-services amazon-redshift alter-table
4个回答
0
投票

使用 EXCEPTION 处理可能会更好

BEGIN
    ALTER TABLE
        <table_name> ADD COLUMN <column_name> <column_type>;
    EXCEPTION
        WHEN duplicate_column
            THEN RAISE NOTICE 'column <column_name> already exists in <table_name>.';
END;

0
投票

Yauheni Khvainitski 的回答并非完全错误。但你确实必须使用 SP,并且 Redshit 拥有的唯一选项(此时是“例外时其他”)。一个例子:

CREATE OR REPLACE PROCEDURE change_column_to_big_int_TABLE_NAME_X(column_name varchar(200)) AS
$$
DECLARE
  new_column_name VARCHAR;
BEGIN
 SELECT INTO new_column_name (table_name)||'_new';
-- RAISE INFO 'new_table_name = % table_name = %',new_column_name, table_name;
 ALTER TABLE TABLE_NAME_X ADD COLUMN "(new_column_name)" bigint;
 EXCEPTION WHEN OTHERS
 THEN RAISE NOTICE 'column already exists on table';
END;
$$
LANGUAGE plpgsql;
    
CALL change_column_to_big_int_TABLE_NAME_X('COLUMN_Y');

来自 AWS 的一些链接:

另请注意,这在此时有效。 Redshift 似乎一直在发展。


0
投票

我认为的问题是AWS Redshift不支持IF语句,而是使用CASE语句。 CASE 语句的实现方式与 IF 非常相似。但我承认,我更喜欢 IF 语句。


0
投票

使用动态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
;

然后你可以这样称呼它:

CALL workdb.add_column_if_not_exists('workdb', 'test_table', 'new_col', 'int');

通过: https://stackoverflow.com/a/78124748/220997

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