Amazon Redshift'te sütun veri türünü değiştirin


85

Amazon Redshift veritabanında sütun veri türü nasıl değiştirilir?

Redshift'te sütun veri türünü değiştiremiyorum; Amazon Redshift'te veri türünü değiştirmenin herhangi bir yolu var mı?


6
"Seçim olarak tablo oluştur ..." Ve yeni tablonuzu daha iyi sütun türüyle tasarlayın.
Guy

Yanıtlar:


137

ALTER TABLE belgelerinde belirtildiği gibi , VARCHARsütunların uzunluğunu şu şekilde değiştirebilirsiniz:

ALTER TABLE table_name
{
    ALTER COLUMN column_name TYPE new_data_type 
}

Diğer sütun türleri için tek düşünebildiğim, doğru veri türüne sahip yeni bir sütun eklemek, ardından eski sütundan tüm verileri yenisine eklemek ve son olarak eski sütunu bırakmaktır.

Şuna benzer bir kod kullanın:

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;

Bir şema değişikliği olacaktır - yeni eklenen sütun bir tablonun sonuncusu olacaktır (bu, COPYifadeyle ilgili bir sorun olabilir , bunu aklınızda bulundurun - ile bir sütun sırası tanımlayabilirsiniz COPY)


4
ALTER veya bu konuda herhangi bir DDL ifadesi, bir işlemde sarılıp sarılmamasına bakılmaksızın derhal taahhüt eder.
Raniendu Singh

@RanienduSingh bazı veritabanları işlemsel DDL ifadelerini destekler. Yetkili bir liste bulamadım, ancak Redshift'teki çoğu DDL ifadesi bir işlemde çalışıyor gibi görünüyor. Ancak, burada açıklanan yaklaşıma benzer işlemleri yeniden düzenlemenin (yeniden adlandır, ekle, güncelle, bırak) daha sağlam olabileceğini düşünüyorum: simple.com/engineering/safe-migrations-with-redshift
Matt Good

1
Varchar sütunlarının boyutunu artırmanın artık mümkün olduğuna dikkat etmek önemlidir - aşağıdaki user0000 yanıtına ve dokümanlara bağlantıya bakın ( docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html )
willis

1
@Tomasz Tybulewicz, user0000'ın yanıtı dahil yanıtınızı günceller misiniz? Cevabınız o zaman doğruydu ama yanıldım. Neyse ki user0000'ün cevabını da okudum
Vzzarr

43

Tomasz'ın bahsettiği şema değişikliğinden kaçınmak için:

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;

1
Kopya ifadesinin yanlış hizalanmasını önlemek için kullandığımız yöntem de budur.
smb

1
Eski tablodan seçim yapmak için kullanılan tüm görünümlerin eski tabloyu göstermeye devam ettiğini unutmayın. drop tableSorgu olabilir ama baypas edilmemelidir bağımlılık hatası gösterecektir.

1
Bunun için teşekkürler, gerçekten yardımcı oldu. 31 milyon satırlık bir masada kullandım ve dc1.large tipini kullanarak sadece 3 dakika sürdü. Harika! Ayrıca biraz daha basit bir form kullandım:INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
Tom

TRANSACTION ile kapsülleme çok önemli
louis_guitton

16

(Son güncelleme) Redshift'te varchar sütunlarının türünü değiştirmek mümkündür.

ALTER COLUMN column_name TYPE new_data_type

Misal:

CREATE TABLE t1 (c1 varchar(100))

ALTER TABLE t1 ALTER COLUMN c1 TYPE varchar(200)

İşte dokümantasyon bağlantısı


Bu mükemmel çalışıyor. Şemayı hiç değiştirmeyecek, ancak veri türünü güncelleyecek güzel bir astar. Bu yeni güncellenmiş cevap olmalı!
Timothy Mcwilliams

8

Eğer varsa sütun sırasını değiştirmek istemiyorsanız o zaman bir seçenek geçici bir tablo oluşturmak olacaktır, damla ve istenilen boyutta yeni bir tane oluşturun ve verileri yeniden toplu olarak.

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;

Tabloyu yeniden oluşturmanın tek sorunu, tekrar izinler vermeniz gerekecek ve eğer tablo çok büyükse, biraz zaman alacaktır.


1
Bu, Wolli'nin eski tablo verilerini yeniden adlandırmak ve ardından yeni şemaya kopyalamak için mevcut yanıtına oldukça benzer. Her ikisi de sütun sırasını koruyacaktır, ancak geçici tablo içeren bu çözüm, verilerin iki kez kopyalanmasını gerektirir. Bir kez geçici tabloya kopyalamak ve diğeri yeni tabloya kopyalamak için. Tabloyu yeniden adlandırmak, yalnızca bir kopya yaparak daha hızlı olmalıdır.
Matt Good

4
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;

3

Redshift'in sütunlu veritabanı olması, veri türünü doğrudan değiştirmenize izin vermez, ancak aşağıda bir yaklaşım bu sütun sırasını değiştirecektir.

Adımlar -

1. tabloya yeni sütun ekleyin 2. yeni sütun değerini eski sütun değeriyle güncelleyin 3. eski sütunu kaldırmak için tabloyu değiştirin 4. sütunu eski sütun olarak yeniden adlandırmak için tabloyu değiştirin

Sütunların sırasını değiştirmek istemiyorsanız, çözüm şu olacaktır:

1. yeni sütun adıyla geçici tablo oluşturun

  1. verileri eski tablodan yeni tabloya kopyala.

  2. eski masayı bırak

  3. yeni tabloyu eski tablo olarak yeniden adlandır

  4. Önemli bir şey, basit oluşturma yerine like komutunu kullanarak yeni bir tablo oluşturmaktır.


2

Bu yöntem, bir (büyük) int sütununu varchar'a dönüştürmek için çalışır

-- 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;

0

Tablo yeniden adlandırma stratejisiyle birlikte BOŞALT ve KOPYALA , tablo yapısını (satır sırası) korumak önemliyse, bu işlemi yapmanın en verimli yolu olmalıdır .

İşte bu cevaba eklenen bir örnek .

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;

-2

aynı sütunu redshift'te güncellemek için bu iyi çalışır

UPDATE table_name 
SET column_name = 'new_value' WHERE column_name = 'old_value'

sql için herhangi bir karışıklığı gidermek için ve kullanarak nerede birden fazla cümle sahibi olabilirsiniz.

şerefe !!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.