จะเปลี่ยนประเภทข้อมูลคอลัมน์ในฐานข้อมูล 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;
drop table
แบบสอบถามจะแสดงข้อผิดพลาดการพึ่งพาซึ่งสามารถ แต่ไม่ควรละเลย
INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
(อัปเดตล่าสุด) เป็นไปได้ที่จะเปลี่ยนประเภทของคอลัมน์ varchar ใน Redshift
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;
ปัญหาเดียวในการสร้างตารางใหม่คือคุณจะต้องให้สิทธิ์อีกครั้งและหากตารางใหญ่เกินไปจะต้องใช้เวลาสักครู่
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 เป็นฐานข้อมูลคอลัมน์ไม่อนุญาตให้คุณแก้ไขประเภทข้อมูลโดยตรงอย่างไรก็ตามด้านล่างนี้เป็นแนวทางหนึ่งที่จะเปลี่ยนลำดับคอลัมน์
ขั้นตอน -
1. ตารางแก้ไขเพิ่มคอลัมน์ใหม่ลงในตาราง 2. อัปเดตค่าคอลัมน์ใหม่ด้วยค่าคอลัมน์เก่า 3. ปรับเปลี่ยนตารางเพื่อวางคอลัมน์เก่า 4. ตารางเพื่อเปลี่ยนชื่อคอลัมน์เป็นคอลัมน์เก่า
หากคุณไม่ต้องการเปลี่ยนลำดับของคอลัมน์วิธีแก้ปัญหาก็คือ
1. สร้างตารางชั่วคราวด้วยชื่อคอลัมน์ใหม่
คัดลอกข้อมูลจากตารางเก่าไปยังตารางใหม่
วางโต๊ะเก่า
เปลี่ยนชื่อ newtable เป็น oldtable
สิ่งสำคัญอย่างหนึ่งสร้างตารางใหม่โดยใช้คำสั่ง like แทนการสร้างแบบธรรมดา
วิธีนี้ใช้ได้กับการแปลงคอลัมน์ 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;
ยกเลิกการดาวน์โหลดและคัดลอกด้วยกลยุทธ์การเปลี่ยนชื่อตารางควรเป็นวิธีที่มีประสิทธิภาพที่สุดในการดำเนินการนี้หากการรักษาโครงสร้างตาราง (ลำดับแถว) เป็นสิ่งสำคัญ
นี่คือตัวอย่างที่เพิ่มเข้ามาในคำตอบนี้
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;
สำหรับการอัปเดตคอลัมน์เดียวกันใน redshift สิ่งนี้จะใช้ได้ดี
UPDATE table_name
SET column_name = 'new_value' WHERE column_name = 'old_value'
คุณสามารถมีหลายประโยคโดยใช้และเพื่อขจัดความสับสนสำหรับ sql
ไชโย !!