PostgreSQL không hỗ trợ bất kỳ tùy chọn cấu hình nào, nhưng có một khả năng khác.
postgres=
Table "public.b"
┌────────┬─────────┬───────────┐
│ Column │ Type │ Modifiers │
╞════════╪═════════╪═══════════╡
│ id │ integer │ │
└────────┴─────────┴───────────┘
Foreign-key constraints:
"b_id_fkey" FOREIGN KEY (id) REFERENCES a(id) DEFERRABLE
Tính toàn vẹn của tham chiếu trong Postgres được triển khai bởi trình kích hoạt và bạn có thể tắt trình kích hoạt trên bảng. Với phương pháp này, bạn có thể tải lên bất kỳ dữ liệu nào (rủi ro), nhưng nhanh hơn đáng kể - vì việc kiểm tra dữ liệu lớn rất tốn kém. Và nếu quá trình tải lên của bạn an toàn, thì bạn có thể làm điều đó.
BEGIN;
ALTER TABLE b DISABLE TRIGGER ALL;
ALTER TABLE b ENABLE TRIGGER ALL;
COMMIT;
Khả năng tiếp theo là sử dụng các ràng buộc hoãn lại. Kiểm tra ràng buộc di chuyển này để cam kết thời gian. Vì vậy, bạn không nên tôn trọng trật tự với INSERT
các lệnh:
ALTER TABLE b ALTER CONSTRAINT b_id_fkey DEFERRABLE;
BEGIN
postgres=
SET CONSTRAINTS
postgres=
INSERT 0 1
postgres=
INSERT 0 1
postgres=
ERROR: insert or update on table "b" violates foreign key constraint "b_id_fkey"
DETAIL: Key (id)=(100) is not present in table "a".
Phương pháp này nên được ưu tiên cho bạn, vì dữ liệu được chèn vào sẽ được kiểm tra.
super user
vai trò để khách hàng không thể làm rối cài đặt sao chép. Có vẻ như tôi phải là một người dùng siêu việt để vô hiệu hóa một số trình kích hoạt hệ thống. (Tôi hiện đang sử dụng tài khoản quản trị viên của mình cũng là chủ sở hữu-- Tôi không chắc tại sao nó hoạt động một lần.) Đặt tùy chọn sao chép cũng không phải là một tùy chọn khả thi, vì điều đó cũng yêu cầusuper user
vai trò. Lựa chọn duy nhất của tôi dường như được thả và tái tạo các phím nước ngoài ...