ฉันได้ลองทำสิ่งต่อไปนี้แล้ว แต่ไม่สำเร็จ:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
ฉันได้ลองทำสิ่งต่อไปนี้แล้ว แต่ไม่สำเร็จ:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
คำตอบ:
" แก้ไขตำแหน่งคอลัมน์ " ใน PostgreSQL Wiki พูดว่า:
ปัจจุบัน PostgreSQL กำหนดลำดับคอลัมน์ตาม
attnum
คอลัมน์ของpg_attribute
ตาราง วิธีเดียวที่จะเปลี่ยนลำดับคอลัมน์คือการสร้างตารางใหม่หรือเพิ่มคอลัมน์และหมุนเวียนข้อมูลจนกว่าคุณจะได้รูปแบบที่ต้องการ
มันค่อนข้างอ่อนแอ แต่ในการป้องกันใน SQL มาตรฐานไม่มีวิธีแก้ปัญหาสำหรับการเปลี่ยนตำแหน่งคอลัมน์เช่นกัน แบรนด์ฐานข้อมูลที่รองรับการเปลี่ยนตำแหน่งลำดับของคอลัมน์กำลังกำหนดส่วนขยายของไวยากรณ์ SQL
อีกแนวคิดหนึ่งเกิดขึ้นกับฉัน: คุณสามารถกำหนด a VIEW
ที่ระบุลำดับของคอลัมน์ตามที่คุณต้องการโดยไม่ต้องเปลี่ยนตำแหน่งทางกายภาพของคอลัมน์ในตารางฐาน
ใน PostgreSQL ในขณะที่การเพิ่มเขตข้อมูลนั้นจะถูกเพิ่มที่ท้ายตาราง หากเราต้องการแทรกเข้าไปในตำแหน่งใดตำแหน่งหนึ่งแล้ว
alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;
โพสต์นี้เก่าและอาจแก้ไขได้ แต่ฉันมีปัญหาเดียวกัน ฉันแก้ไขได้โดยการสร้างมุมมองของตารางเดิมที่ระบุลำดับคอลัมน์ใหม่
จากตรงนี้ฉันสามารถใช้มุมมองหรือสร้างตารางใหม่จากมุมมอง
สร้างมุมมอง original_tab_vw AS เลือก a.col1, a.col3, a.col4, a.col2 จาก original_tab a โดยที่ a.col1 ไม่เป็นโมฆะ - หรืออะไรก็ตาม
เลือก * INTO new_table จาก original_tab_vw
เปลี่ยนชื่อหรือวางตารางเดิมและตั้งชื่อตารางใหม่เป็นตารางเก่า
หนึ่งแม้ว่าตัวเลือกที่งุ่มง่ามในการจัดเรียงคอลัมน์ใหม่เมื่อต้องเปลี่ยนลำดับคอลัมน์อย่างแน่นอนและมีการใช้คีย์ต่างประเทศคือการถ่ายโอนข้อมูลฐานข้อมูลทั้งหมดด้วยข้อมูลก่อนจากนั้นจึงถ่ายโอนข้อมูลเพียง schema ( pg_dump -s databasename > databasename_schema.sql
) จากนั้นแก้ไขไฟล์สคีมาเพื่อจัดเรียงคอลัมน์ใหม่ตามที่คุณต้องการจากนั้นสร้างฐานข้อมูลใหม่จากสคีมาและสุดท้ายคืนค่าข้อมูลลงในฐานข้อมูลที่สร้างขึ้นใหม่
ผมไม่คิดว่าคุณสามารถในปัจจุบันดูบทความนี้ในวิกิพีเดีย PostgreSQL
วิธีแก้ปัญหาสามประการจากบทความนี้คือ:
เปิดตารางใน PGAdmin และในบานหน้าต่าง SQL ที่ด้านล่างคัดลอกคำสั่ง SQL Create Table จากนั้นเปิดเครื่องมือสืบค้นข้อมูลและวาง หากตารางมีข้อมูลให้เปลี่ยนชื่อตารางเป็น "new_name" หากไม่มีให้ลบความคิดเห็น "-" ในบรรทัดวางตาราง แก้ไขลำดับคอลัมน์ตามต้องการ คำนึงถึงเครื่องหมายจุลภาคที่ขาดหายไป / ไม่จำเป็นในคอลัมน์สุดท้ายในกรณีที่คุณย้ายไป ดำเนินการคำสั่งสร้างตาราง SQL ใหม่ รีเฟรชและ ... voila
สำหรับตารางเปล่าในขั้นตอนการออกแบบวิธีนี้ใช้ได้จริง
ในกรณีที่ตารางมีข้อมูลเราจำเป็นต้องจัดเรียงลำดับคอลัมน์ของข้อมูลใหม่ด้วย ง่ายมาก: ใช้INSERT
เพื่อนำเข้าตารางเก่าไปยังเวอร์ชันใหม่ด้วย:
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
... ที่c2
, c3
, c1
มีคอลัมน์c1
, c2
, c3
ของตารางเก่าในตำแหน่งใหม่ของพวกเขา โปรดทราบว่าในกรณีนี้คุณต้องใช้ชื่อ 'ใหม่'สำหรับตาราง 'เก่า' ที่แก้ไขไม่เช่นนั้นข้อมูลของคุณจะสูญหาย ในกรณีที่ชื่อคอลัมน์มีจำนวนมากยาวและ / หรือซับซ้อนให้ใช้วิธีการเดียวกับด้านบนเพื่อคัดลอกโครงสร้างตารางใหม่ลงในโปรแกรมแก้ไขข้อความและสร้างรายการคอลัมน์ใหม่ที่นั่นก่อนที่จะคัดลอกลงในINSERT
คำสั่ง
หลังจากตรวจสอบว่าทั้งหมดเรียบร้อยดีDROP
ตารางเก่าและเปลี่ยนชื่อ 'ใหม่' เป็น 'เก่า' โดยใช้ALTER TABLE new RENAME TO old;
และคุณทำเสร็จแล้ว
ฉันกำลังดำเนินการสั่งซื้อตารางจำนวนมากและไม่ต้องการที่จะต้องเขียนคำค้นหาเดิมซ้ำแล้วซ้ำอีกดังนั้นฉันจึงสร้างสคริปต์ขึ้นมาเพื่อทำทุกอย่างให้ฉัน โดยพื้นฐานแล้วมัน:
pg_dump
pg_dump
แบบสอบถามเดิมเพื่อสร้างตารางที่เรียงลำดับใหม่ด้วยข้อมูลสามารถใช้งานได้โดยรันคำสั่งง่ายๆต่อไปนี้:
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
มันพิมพ์ออก SQL pg_dump
เพื่อให้คุณสามารถตรวจสอบและการทดสอบมันนั่นคือเหตุผลที่ผมใหญ่ขึ้นอยู่บน คุณสามารถค้นหาrepo GitHub ที่นี่
ฉันใช้ Django และต้องใช้คอลัมน์รหัสในแต่ละตารางหากคุณไม่ต้องการปวดหัว น่าเสียดายที่ฉันประมาทและตาราง bp.geo_location_vague ของฉันไม่มีฟิลด์นี้ ฉันเริ่มใช้เคล็ดลับเล็ก ๆ น้อย ๆ ขั้นตอนที่ 1:
CREATE VIEW bp.geo_location_vague_vw AS
SELECT
a.id, -- I change order of id column here.
a.in_date,
etc
FROM bp.geo_location_vague a
ขั้นตอนที่ 2: (โดยไม่ต้องสร้างตาราง - ตารางจะสร้างโดยอัตโนมัติ!)
SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw
ขั้นตอนที่ 3:
CREATE SEQUENCE bp.tbl_tbl_id_seq;
ALTER TABLE bp.geo_location_vague_cp2 ALTER COLUMN id SET DEFAULT nextval('tbl_tbl_id_seq');
ALTER SEQUENCE bp.tbl_tbl_id_seq OWNED BY bp.geo_location_vague_cp2.id;
SELECT setval('tbl_tbl_id_seq', COALESCE(max(id), 0)) FROM bp.geo_location_vague_cp2;
เพราะฉันต้องมีนามแฝงขนาดใหญ่ในตาราง หลังจาก SELECT * ลงใน pg จะสร้างประเภท bigint insetad bigserial
ขั้นตอนที่ 4: ตอนนี้เราสามารถวางมุมมองวางตารางแหล่งที่มาและเปลี่ยนชื่อตารางใหม่ในชื่อเก่า เคล็ดลับจบลงด้วยความเรียบร้อย
มีวิธีแก้ปัญหาบางอย่างเพื่อให้เป็นไปได้:
สร้างตารางใหม่ทั้งหมด
สร้างคอลัมน์ใหม่ภายในตารางปัจจุบัน
สร้างมุมมอง