Postgre 사용 안 함SQL 외부 키의 마이그레이션 확인
Postgre에 외부 키가 있는 마이그레이션을 많이 만들고 있습니다.SQL 9.4.
테이블이 마이그레이션될 때 모든 테이블이 외부 키가 예상하는 순서와 정확히 일치해야 하기 때문에 이 문제가 발생합니다.외부 키에 대해 새 마이그레이션이 종속된 다른 패키지에서 마이그레이션을 실행해야 하는 경우에는 더욱 까다로워집니다.
MySQL에서, 나는 간단히 다음을 추가함으로써 이것을 단순화할 수 있습니다.SET FOREIGN_KEY_CHECKS = 0;
내 마이그레이션 파일의 맨 위에 있습니다.Postgres에서 임시로 이 작업을 수행하려면 어떻게 해야 합니까?마이그레이션 코드 길이에 대해서만 SQL?
BTW, 이를 위해 Laravel Schema Builder를 사용합니다.
마이그레이션의 경우 다음을 사용하여 모든 트리거를 비활성화하는 것이 더 쉽습니다.
SET session_replication_role = 'replica';
마이그레이션 후 다음을 사용하여 모두 다시 활성화
SET session_replication_role = 'origin';
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".
삽입된 데이터가 검사되므로 이 방법을 사용하는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/38112379/disable-postgresql-foreign-key-checks-for-migrations
'programing' 카테고리의 다른 글
git: 치명적:저는 'http' 프로토콜을 처리하지 않습니다. (0) | 2023.05.13 |
---|---|
Postgres에서 두 필드의 MIN()을 얻으려면 어떻게 해야 합니까? (0) | 2023.05.13 |
Sed를 사용하여 문자열을 포함하는 전체 줄 바꾸기 (0) | 2023.05.08 |
.xls 파일을 읽고 쓸 수 있는 .NET Excel 라이브러리 (0) | 2023.05.08 |
스위프트 언어로 된 추상 클래스 (0) | 2023.05.08 |