ฉันจะระบุตำแหน่งสำหรับคอลัมน์ใหม่ใน PostgreSQL ได้อย่างไร


74

ถ้าฉันมีตารางที่มีคอลัมน์:

id | name | created_date

และต้องการเพิ่มคอลัมน์ฉันใช้:

alter table my_table add column email varchar(255)

จากนั้นคอลัมน์จะถูกเพิ่มหลังcreated_dateคอลัมน์

มีวิธีใดบ้างที่ฉันสามารถระบุตำแหน่งสำหรับคอลัมน์ใหม่ได้ เช่นเพื่อให้ฉันสามารถเพิ่มหลังจากnameได้รับตารางเช่น:

id | name | email | created_date

4
ไม่จำเป็นต้องทำเช่นนั้น เพียงแค่ใส่คำสั่งที่คุณเลือกตามลำดับที่คุณต้องการ
a_horse_with_no_name

@ Jonas ดังนั้นคุณสามารถสร้างviewรายการนั้นตามลำดับ ... โดยทางเทคนิคแล้วตำแหน่งของคอลัมน์ไม่สำคัญเท่าที่คุณสามารถกำหนดได้ในลำดับใด ๆ ในแบบสอบถาม ... และโดยทั่วไปคุณไม่ควรทำselect *
xenoterracide

2
@a_horse: มันทำงานได้ยากกว่า (ในฐานะผู้พัฒนา / ผู้ดูแลระบบ) กับตารางเมื่อคอลัมน์มีคำสั่งซื้อที่แตกต่างกันมากมาย เมื่อฉันมี 15 คอลัมน์ในตารางฉันชอบที่จะให้พวกเขาอยู่ในลำดับเดียวกันในฐานข้อมูลทั้งหมด
Jonas

2
@jonas คุณสามารถกำหนดชื่อคอลัมน์เมื่อทำการแทรกและการปรับปรุงและทำให้การสั่งซื้อที่ไม่เกี่ยวข้อง
xenoterracide

2
@ Jonas: จากนั้นเขียนทางเลือกของคุณเองเพื่อ \ d ที่รายงานคอลัมน์ตามลำดับที่คุณต้องการ (เป็นเพียงแบบสอบถามบนตารางระบบ: ลองใช้psql -Eสวิตช์เพื่อดูการค้นหาจริง)
Jack Douglas

คำตอบ:


54

ALTER TABLE ADD COLUMNจะเพิ่มเฉพาะคอลัมน์ใหม่ในตอนท้ายเป็นคอลัมน์สุดท้ายเท่านั้น ในการสร้างคอลัมน์ใหม่ในตำแหน่งอื่นคุณต้องสร้างตารางใหม่และคัดลอกข้อมูลจากตารางเก่า / ปัจจุบันในตารางใหม่นี้



4
ถูกต้อง .. แต่ไม่มีใครใช้วิธีนี้จริงๆเหรอ? :-)
Marian

2
ถ้ามันง่ายกว่าการสร้างตารางใหม่และตารางลูกทั้งหมดกุญแจต่างประเทศและเงินช่วยเหลือ :) ฉันคิดว่าลิงก์อาจมีประโยชน์ด้วยวิธีใดวิธีหนึ่งเนื่องจากมีคำอธิบายว่าทำไมคุณไม่สามารถระบุตำแหน่งและหวังว่าจะสามารถนำไปใช้ใน รุ่นในอนาคต
Jack Douglas

22

คุณจะต้องสร้างตารางใหม่หากคุณต้องการคำสั่งซื้อที่แน่นอน ทำอะไรที่ชอบ:

alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col2, col1, col3 from oldtable;

สร้างดัชนีตามต้องการเป็นต้น


2

หากคุณต้องการสิ่งนี้เพื่อการดูฉันคิดว่าการเก็บมุมมองต่อแต่ละตารางด้วยลำดับคอลัมน์ที่ต้องการและเลือกจากมุมมองแทนที่จะเป็นตาราง

create table my_table (
create view view_my_table as
  select id, name, created_date from my_table;

-- adding a new column
begin;
alter table my_table add column email varchar(255);
drop view view_my_table;
create view view_my_table as
  select id, name, email, created_date from my_table;
commit;

สำหรับวัตถุประสงค์อื่นทั้งหมด (เช่นการแทรกการรวมกัน) เป็นการดีกว่าที่จะระบุรายการคอลัมน์เสมอ

-- bad
insert into my_table values (...);
(select * from my_table)
  union all
(select * from my_table);

-- good
insert into my_table (id, name, email, created_date) values (...);
(select id, name, email, created_date from my_table)
  union all
(select id, name, email, created_date from my_table);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.