TẠO như CHỌN với CONSTRAINT?


7

Tôi có một phần trong SQLđó tạo ra TABLEmột SELECTtuyên bố mẫu trong PostgreSQL; Tôi muốn thêm các ràng buộc vào bảng để ví dụ một cột không thể null.

Tôi không thể tìm thấy SQL hợp lệ cho điều này trong Tài liệu Postgres, vì vậy có vẻ như điều đó là không thể.

Điều gì sẽ là cách tiếp cận tốt nhất để đạt được loại chức năng này? Tôi muốn tạo bảng không thành công nếu ràng buộc bị vi phạm.

Tôi không thể tạo bảng với ràng buộc trước vì có thể có một số biến thể trong một số cột, vì chúng là kết quả của một quy trình động.

Câu trả lời:


10

Một biến thể trong câu trả lời của @ a_horse_with_no_name sẽ là trước tiên tạo bảng với ràng buộc và sau đó chèn vào bảng, vẫn sử dụng giao dịch, vì vậy mọi thứ sẽ quay trở lại trong trường hợp vi phạm ràng buộc. Đây là điều bạn nên cân nhắc nếu các hàng được chèn rất nhiều (tức là trong hàng trăm nghìn hoặc hàng triệu).

Nếu khó tạo create tableđộng câu lệnh, bạn có thể tách phần đó thành 2 câu, với nội dung như sau:

begin transaction ;
    create table new_table                       -- create the table
    as
    select v.*
    from (select ....) as v                      -- as before
    where false ;                                -- but insert 0 rows

    alter table new_table add constraint ... ;   -- add the constraint

    insert into new_table                        -- and then attempt
    select ... ;                                 -- the insert
end ;

Sự khác biệt với cách khác là ràng buộc sẽ ở đó trước khi bất kỳ hàng nào được chèn vào bảng. Và vì NOT NULLvà các CHECKràng buộc không thể bảo vệ được nhưng luôn được kiểm tra ngay lập tức khi một hàng được chèn hoặc sửa đổi (và không ở cuối câu lệnh), câu lệnh chèn của bạn sẽ thất bại (và khôi phục) với hàng đầu tiên vi phạm (các) ràng buộc của bạn có một địa điểm.

Nếu bạn đang chèn nhiều triệu hàng, nó sẽ nhanh hơn, bởi vì nó có thể tìm thấy lỗi nhanh hơn nhưng cũng vì nó sẽ phải khôi phục lại ít phần chèn thêm.


2
Điểm rất tốt
a_horse_with_no_name

5

Bạn cần làm điều đó với hai câu lệnh:

create table new_table
as
select ....;

alter table new_table add constraint ...;

Đảm bảo bạn chạy giao dịch này trong một giao dịch (ví dụ: bằng cách tắt TẮT tự động cam kết trong máy khách SQL của bạn hoặc gói nó bằng một giao dịch begin transaction ...

Nếu alter tablethất bại, bạn có thể khôi phục lại mọi thứ và bảng cũng biến mất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.