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
)
Tomasz가 언급 한 스키마 변경을 방지하려면 :
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;
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;
테이블을 다시 만드는 유일한 문제는 권한을 다시 부여해야하고 테이블이 너무 크면 시간이 오래 걸린다는 것입니다.
컬럼 기반 데이터베이스 인 Redshift에서는 데이터 유형을 직접 수정할 수 없지만 다음은 컬럼 순서를 변경하는 한 가지 접근 방식입니다.
단계-
1. 테이블을 변경하여 테이블에 newcolumn을 추가합니다. 2. newcolumn 값을 oldcolumn 값으로 업데이트합니다. 3. 테이블을 변경하여 oldcolumn을 삭제합니다. 4. 테이블을 변경하여 columnn을 oldcolumn으로 이름을 바꿉니다.
열 순서를 변경하지 않으려면 솔루션은 다음과 같습니다.
1. 새 열 이름으로 임시 테이블 만들기
이전 테이블에서 새 테이블로 데이터를 복사합니다.
오래된 테이블을 버리다
새 테이블을 이전 테이블로 이름을 바꿉니다.
한 가지 중요한 것은 간단한 생성 대신 like 명령을 사용하여 새 테이블을 생성합니다.
이 방법은 (big) 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 with table rename 전략 은 이 작업을 수행 하는 가장 효율적인 방법 입니다.
이 답변에 추가하는 예가 있습니다.
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;