ฉันมีตารางที่มีข้อมูลที่มีอยู่ มีวิธีเพิ่มคีย์หลักโดยไม่ต้องลบและสร้างตารางใหม่หรือไม่
ฉันมีตารางที่มีข้อมูลที่มีอยู่ มีวิธีเพิ่มคีย์หลักโดยไม่ต้องลบและสร้างตารางใหม่หรือไม่
คำตอบ:
( อัปเดต - ขอบคุณผู้ที่แสดงความคิดเห็น )
สมมติว่าคุณมีชื่อตารางtest1
ซึ่งคุณต้องการเพิ่มid
คอลัมน์, คีย์หลัก(ตัวแทน) ที่เพิ่มขึ้นโดยอัตโนมัติ คำสั่งต่อไปนี้ควรเพียงพอใน PostgreSQL รุ่นล่าสุด:
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
ในเวอร์ชันเก่าของ PostgreSQL (ก่อนหน้า 8.x?) คุณต้องทำสิ่งที่สกปรกทั้งหมด ลำดับของคำสั่งต่อไปนี้ควรทำเคล็ดลับ:
ALTER TABLE test1 ADD COLUMN id INTEGER;
CREATE SEQUENCE test_id_seq OWNED BY test1.id;
ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
UPDATE test1 SET id = nextval('test_id_seq');
อีกครั้งใน Postgres เวอร์ชันล่าสุดนี่เทียบเท่ากับคำสั่งเดียวด้านบนโดยประมาณ
ADD PRIMARY KEY
ยังสร้างNOT NULL
ข้อ จำกัด (ทดสอบใน postgres 9.3) ตามที่คาดหวังและต้องการ
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
นี่คือทั้งหมดที่คุณต้อง:
id
คอลัมน์เครดิตมอบให้แก่ @resnyanskiy ผู้ให้คำตอบนี้ในความคิดเห็น
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
ในการใช้คอลัมน์ข้อมูลประจำตัวใน v10
ALTER TABLE test
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;
สำหรับคำอธิบายของคอลัมน์เอกลักษณ์ดูhttps://blog.2ndquadrant.com/postgresql-10-identity-columns/
สำหรับความแตกต่างระหว่างที่สร้างโดยค่าเริ่มต้นและสร้างรายเสมอให้ดูhttps://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/
สำหรับการเปลี่ยนแปลงลำดับดูhttps://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/
SQL Error [23502]: ERROR: column "id" contains null values
ฉันลงจอดที่นี่เพราะฉันกำลังมองหาบางสิ่งเช่นนั้นเช่นกัน ในกรณีของฉันฉันกำลังคัดลอกข้อมูลจากชุดของตาราง staging ที่มีหลายคอลัมน์ลงในหนึ่งตารางในขณะเดียวกันก็กำหนดรหัสของแถวไปยังตารางเป้าหมาย นี่คือความแตกต่างของวิธีการข้างต้นที่ฉันใช้ ฉันเพิ่มคอลัมน์อนุกรมที่ท้ายตารางเป้าหมายของฉัน ด้วยวิธีนี้ฉันไม่ต้องมีตัวยึดตำแหน่งไว้ในคำสั่งแทรก จากนั้นให้เลือก * แบบง่ายในตารางเป้าหมายอัตโนมัติที่มีคอลัมน์นี้ นี่คือคำสั่ง SQL สองคำที่ฉันใช้กับ PostgreSQL 9.6.4
ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;