> 데이터 베이스 > MySQL 튜토리얼 > 특히 MySQL에서 SQL의 순환 참조를 어떻게 해결할 수 있습니까?

특히 MySQL에서 SQL의 순환 참조를 어떻게 해결할 수 있습니까?

Patricia Arquette
풀어 주다: 2024-11-25 02:19:13
원래의
399명이 탐색했습니다.

How Can Circular References in SQL be Resolved, Especially in MySQL?

SQL의 순환 참조: 딜레마

관계형 데이터베이스 설계 영역에서 다음과 같은 질문이 제기됩니다. 서로 참조? 안타깝게도 대답은 사용 중인 특정 데이터베이스 관리 시스템(DBMS)과 원하는 기능에 따라 다릅니다.

문제

주어진 데이터베이스 구조 예시에 예시된 바와 같이 , 두 테이블, products 및 products_pictures에는 순환 참조를 생성하는 외래 키 제약 조건이 있습니다.

products.DEFAULT_PICTURE_ID -> products_pictures.ID
products_pictures.PRODUCT_ID -> products.ID
로그인 후 복사

이 순환성은 다음과 같은 결과를 가져올 수 있습니다. 특히 MySQL의 문제를 해결합니다.

가능한 해결 방법

옵션 1: 조정 가능한 외래 키 Null 허용 여부

한 가지 해결책은 다음과 같습니다. 외래 키 열 중 하나를 null 허용으로 만듭니다. 이를 통해 무결성 제약 조건을 위반하지 않고 두 테이블 모두에 대한 초기 INSERT가 허용됩니다. 그러나 제품이 다른 제품에 속하는 기본 그림을 갖도록 허용하는 등 데이터 무결성 문제가 발생할 수 있습니다. 이 문제를 해결하기 위해 외래 키 제약 조건을 다음과 같이 정의할 수 있습니다.

CONSTRAINT FK_products_1 
  FOREIGN KEY (id, default_picture_id) 
  REFERENCES products_pictures (product_id, id)
  ON DELETE RESTRICT
  ON UPDATE RESTRICT
로그인 후 복사

옵션 2: IsDefault 플래그

또 다른 접근 방식은 DEFAULT_PICTURE_ID 열을 바꾸는 것입니다. products_pictures 테이블에 IsDefault 플래그가 있는 제품 테이블. 이 솔루션에서는 제품당 하나의 그림에만 IsDefault 플래그가 true로 설정되도록 고유 제약 조건이나 인덱스를 정의해야 합니다. 그러나 MySQL은 부분 인덱스를 지원하지 않으므로 이 접근 방식은 실용적이지 않습니다.

옵션 3: 지연 가능한 제약 조건

이 옵션에는 지연 가능한 제약 조건을 사용하는 것이 포함됩니다. 지연 가능한 제약 조건을 사용하면 데이터베이스가 무결성 제약 조건 적용을 일시적으로 지연하여 테이블과 해당 관계의 초기 설정이 가능해집니다. 그러나 MySQL은 연기 가능한 제약 조건을 지원하지 않습니다.

옵션 4: 중간 테이블

순환 참조를 완전히 제거하기 위해 세 번째 테이블을 도입할 수 있습니다.

product_default_picture
----------------------
product_id          NOT NULL
default_picture_id  NOT NULL
PRIMARY KEY (product_id)
FOREIGN KEY (product_id, default_picture_id)
  REFERENCES products_pictures (product_id, id)
로그인 후 복사

이러한 접근 방식은 순환성을 제거하고 데이터를 보장합니다. 무결성.

MySQL 권장 사항

MySQL의 경우 두 가지 옵션이 여전히 실행 가능합니다.

  • 옵션 1: 수정 사항에 대해 논의된 조정 가능한 외래 키 null 허용 여부 데이터 무결성을 강화하려면 위를 참조하세요.
  • 옵션 4: 순환 참조를 피하기 위한 중간 테이블 모두.

위 내용은 특히 MySQL에서 SQL의 순환 참조를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿