2016-06-30 13 views
9

Tôi đang tạo nhiều di chuyển có khóa ngoài trong PostgreSQL 9.4.Vô hiệu hoá kiểm tra khóa ngoài của PostgreSQL để di chuyển

Điều này đang tạo ra một cơn đau đầu vì tất cả các bảng phải theo thứ tự chính xác mà các khóa ngoại được mong đợi khi chúng được di chuyển. Nó thậm chí còn phức tạp hơn nếu tôi phải chạy di chuyển từ các gói khác mà di chuyển mới của tôi phụ thuộc vào một khóa ngoại.

Trong MySQL, tôi có thể đơn giản hóa điều này bằng cách thêm SET FOREIGN_KEY_CHECKS = 0; vào đầu tệp di chuyển của tôi. Làm thế nào tôi có thể làm điều này tạm thời trong PostgresSQL chỉ cho độ dài của mã di chuyển?

BTW, sử dụng Trình tạo lược đồ Laravel cho việc này.

Trả lời

18

PostgreSQL không hỗ trợ bất kỳ tùy chọn cấu hình nào, nhưng có khả năng khác.

postgres=# \d b 
     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 tham chiếu trong Postgres được thực hiện 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 (rủi ro), nhưng nó là nhanh hơn đáng kể - bởi vì việc kiểm tra dữ liệu lớn là tốn kém. Và nếu tải lên của bạn an toàn thì bạn có thể thực hiện.

BEGIN; 
ALTER TABLE b DISABLE TRIGGER ALL; 
-- now the RI over table b is disabled 
ALTER TABLE b ENABLE TRIGGER ALL; 
COMMIT; 

Khả năng tiếp theo đang sử dụng hạn chế hoãn lại. Điều này hạn chế di chuyển kiểm tra để cam kết thời gian. Vì vậy, bạn không nên tôn trọng trật tự với các lệnh INSERT:

ALTER TABLE b ALTER CONSTRAINT b_id_fkey DEFERRABLE; 

BEGIN 
postgres=# SET CONSTRAINTS b_id_fkey DEFERRED; 
SET CONSTRAINTS 
postgres=# INSERT INTO b VALUES(100); -- this is not in a table 
INSERT 0 1 
postgres=# INSERT INTO b VALUES(10); 
INSERT 0 1 
postgres=# COMMIT; 
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 sẽ được ưu tiên hơn vì dữ liệu được chèn sẽ được kiểm tra.

Các vấn đề liên quan