Amazon Redshift에서 열 데이터 유형 변경


85

Amazon Redshift 데이터베이스에서 열 데이터 유형을 변경하는 방법은 무엇입니까?

Redshift에서 열 데이터 유형을 변경할 수 없습니다. Amazon Redshift에서 데이터 유형을 수정할 수있는 방법이 있습니까?


6
"선택으로 테이블 만들기 ..."더 나은 열 유형으로 새 테이블을 디자인합니다.
Guy

답변:


135

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)


4
ALTER 또는 그 문제에 대해 모든 DDL 문은 날씨에 관계없이 트랜잭션에 래핑되었는지 여부에 관계없이 즉시 커밋됩니다.
Raniendu Singh 2016

@RanienduSingh 일부 데이터베이스는 트랜잭션 DDL 문을 지원합니다. 신뢰할 수있는 목록을 찾지 못했지만 Redshift의 대부분의 DDL 문은 트랜잭션에서 작동하는 것으로 보입니다. 그러나 여기에 설명 된 접근 방식 (이름 변경, 추가, 업데이트, 삭제)과 유사한 작업 순서를 변경하는 것이 더 강력 할 수 있다고 생각합니다. simple.com/engineering/safe-migrations-with-redshift
Matt Good

1
user0000의 아래에 답하고 문서 (링크 참조 -이 VARCHAR 컬럼의 크기를 증가하는 것이 가능하다는 지적이의 가치 docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html은 )
윌리스

1
@Tomasz Tybulewicz user0000의 답변을 포함하여 답변을 업데이트 해 주시겠습니까? 당신의 대답은 당시에 맞았지만 나는 오도했습니다. 운 좋게도 user0000의 답변을 읽었습니다
Vzzarr

43

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;

1
이것은 copy 문이 잘못 정렬되는 것을 피하기 위해 우리가 사용하는 방법입니다.
smb

1
이전 테이블에서 선택하는 데 사용 된 모든 뷰는 계속 이전 테이블을 가리 킵니다. drop table쿼리 수 있지만 무시해서는 안 종속성 오류가 표시됩니다.

1
감사합니다. 정말 도움이되었습니다. 3,100 만 개의 행이있는 테이블에서 사용했는데 dc1.large 유형을 사용하면 3 분 밖에 걸리지 않았습니다. 큰! 또한 약간 더 간단한 형식을 사용했습니다.INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
Tom

TRANSACTION으로 캡슐화하는 것은 매우 중요합니다.
louis_guitton

16

(최근 업데이트) 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)

다음은 문서 링크입니다.


이것은 완벽하게 작동합니다. 스키마를 전혀 변경하지 않고 데이터 유형을 업데이트하는 멋진 라이너. 이것은 새로운 업데이트 된 답변이어야합니다!
Timothy Mcwilliams

8

이 경우 열 순서를 변경하지 않으 다음, 옵션은 임시 테이블을 만드는 것, 드롭 및 원하는 크기로 새를 생성하고 데이터를 다시 일괄.

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;

테이블을 다시 만드는 유일한 문제는 권한을 다시 부여해야하고 테이블이 너무 크면 시간이 오래 걸린다는 것입니다.


1
이것은 Wolli의 기존 답변과 매우 유사하여 이전 테이블 데이터를 새 스키마에 복사 한 다음 이름을 바꿉니다. 둘 다 열 순서를 유지하지만 임시 테이블이있는이 솔루션은 데이터를 두 번 복사해야합니다. 한 번은 임시 테이블에 복사하고 다른 하나는 새 테이블에 다시 복사합니다. 하나의 복사 만 수행하면 테이블 이름을 변경하는 것이 더 빨라집니다.
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에서는 데이터 유형을 직접 수정할 수 없지만 다음은 컬럼 순서를 변경하는 한 가지 접근 방식입니다.

단계-

1. 테이블을 변경하여 테이블에 newcolumn을 추가합니다. 2. newcolumn 값을 oldcolumn 값으로 업데이트합니다. 3. 테이블을 변경하여 oldcolumn을 삭제합니다. 4. 테이블을 변경하여 columnn을 oldcolumn으로 이름을 바꿉니다.

열 순서를 변경하지 않으려면 솔루션은 다음과 같습니다.

1. 새 열 이름으로 임시 테이블 만들기

  1. 이전 테이블에서 새 테이블로 데이터를 복사합니다.

  2. 오래된 테이블을 버리다

  3. 새 테이블을 이전 테이블로 이름을 바꿉니다.

  4. 한 가지 중요한 것은 간단한 생성 대신 like 명령을 사용하여 새 테이블을 생성합니다.


2

이 방법은 (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;

0

테이블 구조 (행 순서)를 유지하는 것이 중요한 경우 UNLOADCOPY 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;

-2

redshift에서 동일한 열을 업데이트하면 정상적으로 작동합니다.

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

SQL에 대한 혼란을 제거하기 위해 and를 사용하여 여러 절을 가질 수 있습니다.

건배!!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.