Изменение типа данных столбца в Amazon Redshift
Как изменить тип данных столбца в базе данных Amazon Redshift?
Я не могу изменить тип данных столбца в Redshift; есть ли способ изменить тип данных в Amazon Redshift?
Ответы
Ответ 1
В настоящее время нет способа изменить столбец в базе данных красного смещения.
Все, что я могу придумать, это добавить новый столбец с правильным типом данных, затем вставить все данные из старого столбца в новый и, наконец, удалить старый столбец.
Используйте код, подобный следующему:
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
)
Ответ 2
чтобы избежать изменения схемы, упомянутого Томашем:
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;
Ответ 3
Последнее обновление (по состоянию на 15 марта 2019 г.) Redshift
- позволяет изменять столбцы ТОЛЬКО типов varchar.
- Вы можете только увеличить длину поля. Вы не можете уменьшить его.
- Столбец Alter нельзя запустить внутри блока транзакции. (До свидания скрипты миграции)
Из документации,
https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html
ALTER COLUMN column_name TYPE new_data_type
Предложение, которое изменяет размер столбца, определенного как тип данных VARCHAR. Примите во внимание следующие ограничения:
- Вы не можете изменить столбец с помощью кодировок сжатия BYTEDICT, RUNLENGTH, TEXT255 или TEXT32K.
- Вы не можете уменьшить размер меньше максимального размера существующих данных.
- Вы не можете изменять столбцы со значениями по умолчанию.
- Вы не можете изменять столбцы с помощью UNIQUE, PRIMARY KEY или FOREIGN KEY.
- Вы не можете изменять столбцы внутри блока с несколькими выражениями (BEGIN... END).
Ответ 4
Если вы не хотите изменять порядок столбцов, параметр будет создавать временную таблицу, отбрасывать и создавать новый с нужным размером, а затем снова массировать данные.
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;
Единственная проблема, связанная с воссозданием таблицы, заключается в том, что вам нужно будет предоставить дополнительные разрешения, и если таблица будет слишком большой, потребуется некоторое время.
Ответ 5
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;
Ответ 6
(Недавнее обновление) Возможно изменить тип столбцов varchar в Redshift.
ALTER COLUMN column_name TYPE new_data_type
Пример:
CREATE TABLE t1 (c1 varchar(100))
ALTER TABLE t1 ALTER COLUMN c1 TYPE varchar(200)
Вот ссылка на документацию link
Ответ 7
Redshift, являющийся колоночной базой данных, не позволяет вам напрямую изменять тип данных, однако ниже приведен один из подходов, который изменит порядок столбцов.
Шаги -
1.Alter table добавить newcolumn в таблицу 2. Обновите значение newcolumn значением oldcolumn 3.Alter table, чтобы удалить таблицу oldcolumn 4.alter, чтобы переименовать columnn в oldcolumn
Если вы не хотите изменять порядок столбцов, то решение будет
1. создать временную таблицу с новым именем столбца
-
скопировать данные из старой таблицы в новую таблицу.
-
уронить старый стол
-
переименовать newtable в oldtable
-
Одна важная вещь - создать новую таблицу, используя команду like вместо простого create.
Ответ 8
Этот метод работает для преобразования (большого) столбца 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;
Ответ 9
для обновления того же столбца в красном смещении это будет работать нормально
UPDATE table_name
SET column_name = 'new_value' WHERE column_name = 'old_value'
Вы можете иметь несколько предложений в где с помощью и, чтобы устранить путаницу для SQL
ура !!