Як змінити тип даних стовпців у базі даних 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. створити тимчасову таблицю з новою назвою стовпця
скопіювати дані зі старої таблиці в нову таблицю.
скинути старий стіл
перейменувати newtable на oldtable
Одна важлива річ - створити нову таблицю за допомогою команди 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;
РАЗГРУЗКА та КОПІЮВАННЯ зі стратегією перейменування таблиці повинні бути найефективнішим способом зробити цю операцію, якщо важливо зберегти структуру таблиці (порядок рядків).
Ось приклад, що додається до цієї відповіді.
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
ура!