Amazon Redshift में Alter column data type


85

Amazon Redshift डेटाबेस में कॉलम डेटा प्रकार कैसे बदलें?

मैं Redshift में कॉलम डेटा प्रकार को बदलने में सक्षम नहीं हूं; क्या Amazon Redshift में डेटा प्रकार को संशोधित करने का कोई तरीका है?


6
"तालिका का चयन करें के रूप में बनाएँ ..." और बेहतर स्तंभ प्रकार के साथ अपनी नई तालिका डिज़ाइन करें।
गाइ

जवाबों:


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
अलर्ट या उस मामले के लिए कोई भी डीडीएल बयान मौसम की परवाह किए बिना तुरंत लेनदेन में लिपटे हुए या नहीं।
रानीन्दु सिंह

@RanienduSingh कुछ डेटाबेस ट्रांसेक्शनल DDL स्टेटमेंट का समर्थन करते हैं। मुझे एक आधिकारिक सूची नहीं मिली है, लेकिन Redshift में अधिकांश DDL कथन लेन-देन में काम करते दिखाई देते हैं। हालांकि, मुझे लगता है कि यहां वर्णित दृष्टिकोण (नाम, ऐड, अपडेट, ड्रॉप) के समान संचालन को फिर से मजबूत करना अधिक मजबूत हो सकता है: simple.com/engineering/safe-migrations-with-redshift
मैट गुड

1
नीचे user0000 के जवाब और डॉक्स (के लिए लिंक देखते हैं - यह ध्यान देने योग्य बात यह है कि यह अब varchar स्तंभ का आकार बढ़ाने के लिए संभव है लायक docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html )
विलिस

1
@Tomasz Tybulewicz क्या आप उपयोगकर्ता के जवाब सहित अपने उत्तर को अपडेट करेंगे? उस समय आपका उत्तर सही था लेकिन मुझे गुमराह किया गया। सौभाग्य से मैं भी user0000 के जवाब पढ़ें
Vzzarr

43

टॉमाज़ द्वारा वर्णित स्कीमा परिवर्तन से बचने के लिए:

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
यह वह विधि है जिसका उपयोग हम नकल कथन को गलत बताने से बचने के लिए करते हैं।
smb

1
ध्यान रखें कि पुरानी तालिका से चयन करने के लिए उपयोग किए जाने वाले कोई भी दृश्य पुरानी तालिका की ओर संकेत करते हैं। drop tableक्वेरी निर्भरता त्रुटि जो हो सकता है लेकिन नजरअंदाज नहीं किया जाना चाहिए दिखाएगा।

1
इसके लिए धन्यवाद, यह वास्तव में मददगार था। मैंने इसे 31 मिलियन पंक्तियों वाली तालिका में उपयोग किया और इसे dc1.large प्रकार का उपयोग करते हुए केवल 3 मिनट लगे। महान! मैंने थोड़ा सा सरल रूप भी इस्तेमाल किया:INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
टॉम


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)

यहाँ प्रलेखन लिंक है


यह पूरी तरह से काम करता है। एक अच्छा एक लाइनर जो स्कीमा को बिल्कुल नहीं बदलेगा लेकिन डेटा प्रकार को अपडेट करेगा। यह नया अपडेटेड उत्तर होना चाहिए!
टिमोथी मैकविलियम्स

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
यह वूली से मौजूदा नाम बदलने और फिर पुराने स्कीम डेटा को नए स्कीमा में कॉपी करने के समान है। दोनों कॉलम ऑर्डर रखेंगे, लेकिन टेम्प टेबल के साथ इस समाधान के लिए डेटा को दो बार कॉपी करना होगा। एक बार अस्थायी तालिका में कॉपी करने के लिए, और नई तालिका में वापस कॉपी करने के लिए। केवल एक प्रति का प्रदर्शन करके तालिका का नाम बदलना अधिक तेज़ होना चाहिए।
मैट गुड

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. नरम तालिका तालिका में नया कॉलम जोड़ें

यदि आप कॉलम के क्रम को बदलना नहीं चाहते हैं तो समाधान होगा

1. नए स्तंभ नाम के साथ अस्थायी तालिका बनाएँ

  1. पुरानी तालिका से नई तालिका तक डेटा कॉपी करें।

  2. पुराना टेबल गिरा दो

  3. पुराने के लिए नया नाम बदलें

  4. एक महत्वपूर्ण बात यह है कि सरल बनाने के बजाय कमांड जैसी एक नई तालिका बनाएं।


2

यह विधि एक (बड़े) इंट कॉलम को एक चर में परिवर्तित करने के लिए काम करती है

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

तालिका का नाम बदलने की रणनीति के साथ UNLOAD और COPY इस ऑपरेशन को करने के लिए सबसे कारगर तरीका होना चाहिए यदि टेबल संरचना (पंक्ति क्रम) को बनाए रखना महत्वपूर्ण है।

इस जवाब में एक उदाहरण और जोड़ा गया है ।

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 के लिए किसी भी भ्रम को दूर करने के लिए कई खंड हो सकते हैं

चियर्स !!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.