অ্যামাজন রেডশিফ্টে কলামের ডেটা টাইপ পরিবর্তন করুন


85

অ্যামাজন রেডশিফ্ট ডাটাবেসে কীভাবে কলামের ডেটা পরিবর্তন করবেন?

আমি রেডশিফ্টে কলামের তথ্য প্রকারের পরিবর্তন করতে সক্ষম নই; অ্যামাজন রেডশিফটে ডেটা টাইপ পরিবর্তন করার কোনও উপায় আছে?


6
"নির্বাচন মতো টেবিল তৈরি করুন ..." এবং আরও ভাল কলামের ধরণের সাথে আপনার নতুন টেবিলটি ডিজাইন করুন।
গাই

উত্তর:


137

অল্টার টেবিল ডকুমেন্টেশনে উল্লিখিত হিসাবে , আপনি VARCHARব্যবহার করে কলামগুলির দৈর্ঘ্য পরিবর্তন করতে পারেন

ALTER TABLE table_name
{
    ALTER COLUMN column_name TYPE new_data_type 
}

অন্যান্য কলামের ধরণের জন্য আমি যা ভাবতে পারি তা হ'ল একটি সঠিক ডাটাবেট সহ একটি নতুন কলাম যুক্ত করা, তারপরে পুরানো কলাম থেকে সমস্ত নতুন ডেটা oneোকানো এবং শেষ পর্যন্ত পুরানো কলামটি বাদ দেওয়া।

এর মতো কোড ব্যবহার করুন:

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
পরিবর্তিত বা এই বিষয়ে কোনও ডিডিএল বিবৃতি আবহাওয়া নির্বিশেষে তা লেনদেনে জড়িত হোক বা না তা অবিলম্বে প্রতিশ্রুতিবদ্ধ।
রানীেন্দু সিং 11

@ রাণেন্দুসিংহ কয়েকটি ডাটাবেস ট্রানজেকশনাল ডিডিএল বিবৃতি সমর্থন করে। আমি কোনও অনুমোদনযোগ্য তালিকা পাই নি, তবে রেডশিফ্টের বেশিরভাগ ডিডিএল স্টেটমেন্টগুলি কোনও লেনদেনে কাজ করে বলে মনে হচ্ছে। তবে আমি মনে করি এখানে বর্ণিত পদ্ধতির অনুরূপ অপারেশনগুলিকে পুনরায় সাজানো (নাম পরিবর্তন, সংযোজন, আপডেট, ড্রপ) আরও দৃ
ম্যাট গুড

4
লক্ষ্য করার মতো বিষয় যে এখন বর্ণাচর কলামগুলির আকার বাড়ানো সম্ভব - নীচে ব্যবহারকারীর0000 এর উত্তর এবং ডক্সের লিঙ্ক ( ডকস.ওএস.আমজোন.com / redshift / latest / dg / r_ALTER_TABLE.html )
উইলিস

4
@ টমাসজ টাইবুলিউইচিজ আপনি দয়া করে ব্যবহারকারীর0000 এর উত্তর সহ আপনার উত্তর আপডেট করবেন? আপনার উত্তরটি তখন সঠিক ছিল তবে আমি বিভ্রান্ত হয়েছিলাম। ভাগ্যক্রমে আমি ব্যবহারকারীর0000 এর উত্তরও পড়েছি
ভিজার

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;

4
অনুলিপিযুক্ত অনুলিপি বিবৃতি এড়াতে এই পদ্ধতিটি আমরা পাশাপাশি ব্যবহার করি।
এসএমবি

4
মনে রাখবেন যে পুরানো টেবিল থেকে যে কোনও দর্শন নির্বাচন করা ব্যবহার করা হয়েছে তা পুরানো টেবিলের দিকে নির্দেশ করে। drop tableক্যোয়ারী নির্ভরতা ত্রুটি ঘটেছে, যা হতে পারে কিন্তু বাইপাস করা উচিত নয় দেখাবে।

4
এই জন্য ধন্যবাদ, এটি সত্যিই সহায়ক ছিল। আমি এটি 31 মিলিয়ন সারি সহ একটি টেবিলে ব্যবহার করেছি এবং dc1.large প্রকারটি ব্যবহার করে এটি কেবল 3 মিনিট সময় নেয়। দুর্দান্ত! আমি কিছুটা সহজ ফর্মও ব্যবহার করেছি:INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
টম


16

(সাম্প্রতিক আপডেট) রেডশিফ্টে ভারচর কলামগুলির প্রকারের পরিবর্তন করা সম্ভব।

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;

সারণী পুনরুদ্ধার করার একমাত্র সমস্যা হ'ল আপনাকে আবার অনুমতি দেওয়ার দরকার হবে এবং টেবিলটি আরও বড় হলে এটি কিছু সময় নিতে পারে।


4
এটি ওল্লি থেকে পুনরায় নামকরণ এবং তারপরে পুরানো টেবিলের ডেটাটিকে নতুন স্কিমে অনুলিপি করার জন্য বিদ্যমান উত্তরের সাথে বেশ মিল। উভয়ই কলামের আদেশ রাখবে, তবে একটি টেম্প টেবিল সহ এই সমাধানের জন্য ডেটা দুবার অনুলিপি করা দরকার। একবার টেম্প টেবিলের অনুলিপি করতে এবং অন্যটি আবার নতুন টেবিলটিতে অনুলিপি করুন। কেবলমাত্র একটি অনুলিপি সম্পাদন করে টেবিলটির নামকরণ দ্রুত হওয়া উচিত।
ম্যাট শুভ

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

রেডশিফ্ট কলামার ডাটাবেস হ'ল আপনাকে সরাসরি ডেটাটাইপটি পরিবর্তন করতে দেয় না, তবে নীচে একটি পদ্ধতির নীচে এটি কলামের ক্রম পরিবর্তন করবে।

পদক্ষেপ -

1.আল্টার টেবিলটি টেবিলটিতে নতুন কলামটি যুক্ত করুন 2. পুরাতনকোলোম মান সহ নিউক্লম মানটি আপডেট করুন 3. পুরাতনকোলোমটি ড্রপ করার জন্য অল্টার টেবিলটি 4. কলামটির পুরানো কলামে নাম রাখার জন্য টেবিলের টেবিলটি

আপনি যদি কলামগুলির ক্রম পরিবর্তন করতে না চান তবে সমাধানটি হবে

নতুন কলামের নাম সহ টেম্প টেবিল তৈরি করুন

  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

সারণী পুনঃনামকরণ কৌশল সহ আনলড এবং কপি সবচেয়ে কার্যকর উপায় হওয়া উচিত সারণীর কাঠামো (সারির ক্রম) বজায় রাখা যদি গুরুত্বপূর্ণ হয় তবে এই অপারেশনটি করার ।

এই উত্তরটি যুক্ত করার জন্য এখানে একটি উদাহরণ ।

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

রেডশিফটে একই কলামটি আপডেট করার জন্য এটি ভাল কাজ করবে

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

যেখানে স্কয়ারের জন্য কোনও বিভ্রান্তি দূর করতে আপনি যেখানে একাধিক ধারা থাকতে পারেন

চিয়ার্স !!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.