Как изменить тип данных столбца в базе данных Amazon Redshift?
Я не могу изменить тип данных столбца в Redshift; есть ли способ изменить тип данных в Amazon Redshift?
Как изменить тип данных столбца в базе данных Amazon Redshift?
Я не могу изменить тип данных столбца в Redshift; есть ли способ изменить тип данных в Amazon Redshift?
Ответы:
Как отмечено в документации ALTER TABLE , вы можете изменить длину VARCHAR
столбцов, используя
ALTER TABLE table_name
{
ALTER COLUMN column_name TYPE new_data_type
}
Для других типов столбцов все, что я могу придумать, - это добавить новый столбец с правильным типом данных, затем вставить все данные из старого столбца в новый и, наконец, удалить старый столбец.
Используйте код, похожий на этот:
ALTER TABLE t1 ADD COLUMN new_column ___correct_column_type___;
UPDATE t1 SET new_column = column;
ALTER TABLE t1 DROP COLUMN column;
ALTER TABLE t1 RENAME COLUMN new_column TO column;
Произойдет изменение схемы - новый добавленный столбец будет последним в таблице (это может быть проблемой с COPY
оператором, имейте это в виду - вы можете определить порядок столбцов с помощью COPY
)
чтобы избежать изменения схемы, упомянутого Томашем:
BEGIN TRANSACTION;
ALTER TABLE <TABLE_NAME> RENAME TO <TABLE_NAME>_OLD;
CREATE TABLE <TABLE_NAME> ( <NEW_COLUMN_DEFINITION> );
INSERT INTO <TABLE_NAME> (<NEW_COLUMN_DEFINITION>)
SELECT <COLUMNS>
FROM <TABLE_NAME>_OLD;
DROP TABLE <TABLE_NAME>_OLD;
END TRANSACTION;
drop table
Запрос покажет ошибку зависимости , которая может быть , но не должно быть обойдены.
INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
(Недавнее обновление) В Redshift можно изменить тип столбцов varchar.
ALTER COLUMN column_name TYPE new_data_type
Пример:
CREATE TABLE t1 (c1 varchar(100))
ALTER TABLE t1 ALTER COLUMN c1 TYPE varchar(200)
Вот ссылка на документацию
Если вы не хотите изменять порядок столбцов , можно будет создать временную таблицу, отбросить и создать новую с желаемым размером, а затем снова собрать данные.
CREATE TEMP TABLE temp_table AS SELECT * FROM original_table;
DROP TABLE original_table;
CREATE TABLE original_table ...
INSERT INTO original_table SELECT * FROM temp_table;
Единственная проблема при воссоздании таблицы заключается в том, что вам нужно будет снова предоставить разрешения, и если таблица слишком велика, это займет некоторое время.
ALTER TABLE publisher_catalogs ADD COLUMN new_version integer;
update publisher_catalogs set new_version = CAST(version AS integer);
ALTER TABLE publisher_catalogs DROP COLUMN version RESTRICT;
ALTER TABLE publisher_catalogs RENAME new_version to version;
Redshift, являющийся колоночной базой данных, не позволяет вам напрямую изменять тип данных, однако ниже представлен один из подходов, который изменит порядок столбцов.
Шаги -
1. изменить таблицу, добавить новый столбец в таблицу 2. обновить значение нового столбца значением старого столбца 3. изменить таблицу, чтобы удалить старый столбец 4. изменить таблицу, чтобы переименовать столбец в старый столбец
Если вы не хотите изменять порядок столбцов, решение будет заключаться в
1. создать временную таблицу с новым именем столбца
копировать данные из старой таблицы в новую.
сбросить старую таблицу
переименуйте новую таблицу в старую таблицу
Одна важная вещь - создать новую таблицу, используя команду like вместо простого create.
Этот метод работает для преобразования (большого) столбца int в varchar
-- Create a backup of the original table
create table original_table_backup as select * from original_table;
-- Drop the original table, and then recreate with new desired data types
drop table original_table;
create table original_table (
col1 bigint,
col2 varchar(20) -- changed from bigint
);
-- insert original entries back into the new table
insert into original_table select * from original_table_backup;
-- cleanup
drop original_table_backup;
UNLOAD и COPY со стратегией переименования таблицы должны быть наиболее эффективным способом выполнения этой операции, если важно сохранить структуру таблицы (порядок строк).
Вот пример добавления к этому ответу.
BEGIN TRANSACTION;
ALTER TABLE <TABLE_NAME> RENAME TO <TABLE_NAME>_OLD;
CREATE TABLE <TABLE_NAME> ( <NEW_COLUMN_DEFINITION> );
UNLOAD ('select * from <TABLE_NAME>_OLD') TO 's3://bucket/key/unload_' manifest;
COPY <TABLE_NAME> FROM 's3://bucket/key/unload_manifest'manifest;
END TRANSACTION;
для обновления того же столбца в красном смещении это будет работать нормально
UPDATE table_name
SET column_name = 'new_value' WHERE column_name = 'old_value'
у вас может быть несколько предложений в where, используя и, чтобы устранить любую путаницу для sql
ура !!