ไม่มีกลไกดังกล่าวใน PostgreSQL
อย่างไรก็ตามคุณยังสามารถหลีกเลี่ยงผลกระทบที่มากเกินไปจากการเปลี่ยนแปลงตารางดังกล่าวได้
คำสั่งต่อไปนี้จะได้รับการล็อคแบบเอกสิทธิ์การเข้าถึงบนโต๊ะในช่วงเวลาของคำสั่ง / การทำธุรกรรม:
ALTER TABLE your_table
ADD COLUMN new_column integer NOT NULL DEFAULT 0;
คำสั่งนี้เปลี่ยนแคตตาล็อกแล้วเขียนทั้งตารางใหม่เพื่อให้คอลัมน์ใหม่มีค่าเริ่มต้นในทุกแถว หากตารางมีหลายแถวและมีการเข้าถึงบ่อยครั้งเพียงพอจะทำให้เกิดปัญหาชั่วคราวบางอย่าง
ในการหลีกเลี่ยงให้ลองล็อคเอกสิทธิ์ให้สั้นที่สุดเท่าที่จะทำได้:
ALTER TABLE your_table
ADD COLUMN new_column integer;
ALTER TABLE your_table
ALTER COLUMN new_column SET DEFAULT 0;
เนื่องจากนี่เป็นเพียงการเปลี่ยนแปลง (จริง ๆ สอง) ในแค็ตตาล็อก (ไม่มีการเปลี่ยนแปลงข้อมูล) มันจะเสร็จสมบูรณ์อย่างรวดเร็ว จากนั้นก็ขึ้นอยู่กับความต้องการและการใช้ตารางของคุณคุณสามารถอัปเดตคอลัมน์ใหม่ที่จะเริ่มต้นในขั้นตอนที่หนึ่งหรือใน batches NOT NULL
และเมื่อเสร็จสิ้นการตั้งค่าของคอลัมน์เพื่อ
อัปเดตเกี่ยวกับความปรารถนาที่เป็นจริง: PostgreSQL 11 จะมีคุณสมบัตินี้ ดูhttps://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/สำหรับข้อมูลเพิ่มเติม