Không có cơ chế như vậy trong PostgreSQL.
Tuy nhiên, bạn vẫn có thể tránh các tác động quá mức của việc thay đổi bảng như vậy.
Câu lệnh sau có được khóa độc quyền truy cập trên bảng trong suốt thời gian của câu lệnh / giao dịch:
ALTER TABLE your_table
ADD COLUMN new_column integer NOT NULL DEFAULT 0;
Câu lệnh này thay đổi danh mục, sau đó viết lại toàn bộ bảng để cột mới chứa giá trị mặc định trong tất cả các hàng. Nếu bảng có nhiều hàng và được truy cập đủ thường xuyên, điều này sẽ gây ra một số vấn đề tạm thời.
Để tránh điều đó, hãy cố gắng giữ khóa độc quyền càng ngắn càng tốt:
ALTER TABLE your_table
ADD COLUMN new_column integer;
ALTER TABLE your_table
ALTER COLUMN new_column SET DEFAULT 0;
Vì về cơ bản, đây chỉ là một thay đổi (thực tế là hai) đối với danh mục (không có thay đổi dữ liệu nào xảy ra), nó sẽ hoàn thành khá nhanh. Sau đó tùy thuộc vào nhu cầu và cách sử dụng bảng của bạn, bạn có thể cập nhật cột mới thành mặc định theo một bước hoặc theo đợt và khi hoàn tất, hãy đặt cột thành NOT NULL
.
Cập nhật về một điều ước sắp thành hiện thực: PostgreQuery 11 sẽ có tính năng này. Xem https://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/ để biết thêm.