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ı?
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ı?
Yanıtlar:
ALTER TABLE belgelerinde belirtildiği gibi , VARCHAR
sü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, COPY
ifadeyle ilgili bir sorun olabilir , bunu aklınızda bulundurun - ile bir sütun sırası tanımlayabilirsiniz COPY
)
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;
drop table
Sorgu olabilir ama baypas edilmemelidir bağımlılık hatası gösterecektir.
INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
(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ı
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.
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'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
verileri eski tablodan yeni tabloya kopyala.
eski masayı bırak
yeni tabloyu eski tablo olarak yeniden adlandır
Önemli bir şey, basit oluşturma yerine like komutunu kullanarak yeni bir tablo oluşturmaktır.
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;
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;
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 !!