[postgresql] 마이그레이션을위한 PostgreSQL 외래 키 검사 비활성화
PostgreSQL 9.4에서 외래 키가있는 마이그레이션을 많이 만들고 있습니다.
테이블이 모두 마이그레이션 될 때 외래 키가 예상하는 정확한 순서를 따라야하기 때문에 골치 아픈 일입니다. 내 새 마이그레이션이 외래 키에 의존하는 다른 패키지에서 마이그레이션을 실행해야하는 경우 더욱 끈적 거립니다.
MySQL에서는 SET FOREIGN_KEY_CHECKS = 0;
마이그레이션 파일의 맨 위에 간단히 추가 하여 이를 단순화 할 수 있습니다 . 마이그레이션 코드 길이에 대해서만 PostgresSQL에서 임시로이 작업을 수행하려면 어떻게해야합니까?
BTW,이를 위해 Laravel Schema Builder를 사용합니다.
답변
PostgreSQL은 구성 옵션을 지원하지 않지만 다른 가능성이 있습니다.
postgres=# \d b
Table "public.b"
┌────────┬─────────┬───────────┐
│ Column │ Type │ Modifiers │
╞════════╪═════════╪═══════════╡
│ id │ integer │ │
└────────┴─────────┴───────────┘
Foreign-key constraints:
"b_id_fkey" FOREIGN KEY (id) REFERENCES a(id) DEFERRABLE
Postgres의 참조 무결성은 트리거로 구현되며 테이블에서 트리거를 비활성화 할 수 있습니다. 이 방법을 사용하면 모든 데이터 (위험)를 업로드 할 수 있지만 대용량 데이터를 검사하는 데 비용이 많이 들기 때문에 훨씬 더 빠릅니다. 업로드가 안전하다면 할 수 있습니다.
BEGIN;
ALTER TABLE b DISABLE TRIGGER ALL;
-- now the RI over table b is disabled
ALTER TABLE b ENABLE TRIGGER ALL;
COMMIT;
다음 가능성은 지연된 제약을 사용하는 것입니다. 이 이동 제약 검사는 시간을 커밋합니다. 따라서 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".
삽입 된 데이터를 확인하므로이 방법이 선호됩니다.
답변
마이그레이션의 경우 다음을 사용하여 모든 트리거를 비활성화하는 것이 더 쉽습니다.
SET session_replication_role = 'replica';
마이그레이션 후
SET session_replication_role = 'origin';