문제

네 가지 다른 부분 중 하나가 포함될 수 있지만 동일한 부분의 컬렉션은 고유한 것으로 처리되어야 하는 관계를 만들려고 합니다.

예:할당에는 할당된 회사가 있어야 하며 선택적으로 할당된 위치, 작업 그룹 및 프로그램이 있을 수도 있습니다.과제에는 위치가 없는 작업 그룹이 있을 수 없습니다.

회사 A, B, C가 있다고 가정해 보겠습니다.위치 X, Y, Z;작업 그룹 I, J, K 및 프로그램 1, 2, 3.

따라서 유효한 관계에는 다음이 포함될 수 있습니다. ᅡ - 엑스 - 나 - 1 ᅡ - Z - 2 ᄂ - ᄂ C 씨 - 3 B - Z - K

그러나 유효하지 않은 관계에는 다음이 포함됩니다. A - K(위치가 없는 작업 그룹) Y - K - 1 (회사 없음)

그래서 테이블을 만들기 위해 다음을 만들었습니다.

companyID INT NOT NULL,
FOREIGN KEY companyKEY (companyID) REFERENCES company (companyID),
locationID INT,
FOREIGN KEY locationKEY (locationID) REFERENCES location (locationID),
workgroupID INT,
FOREIGN KEY workgroupKEY (workgroupID) REFERENCES workgroup (workgroupID),
programID INT,
FOREIGN KEY programKEY (programID) REFERENCES program (programID),
UNIQUE KEY companyLocationWorkgroupProgramKEY (companyID, locationID, workgroupID, programID)

작업 그룹이 있는 경우 위치를 지정해야 하는 할당의 필요성 외에 이것이 내 모든 관계를 처리할 것이라고 생각합니다(프로그래밍 방식으로 또는 트리거를 사용하여 행복하게 수행할 수 있다고 생각합니다).

하지만 이 스키마를 테스트하면 다음을 입력할 수 있습니다.

INSERT INTO test VALUES (1, null, null, null), (1, null, null, null);

...불평 없이.나는 (1, null, null, null)이 null이 포함되어 있기 때문에 그 자체와 같지 않다고 추측합니다.이런 경우, 이 관계를 처리할 수 있는 방법이 있나요?

어떤 도움이라도 주시면 감사하겠습니다!

도움이 되었습니까?

해결책

이것은 기능입니다 (내가 기대 한 것은 아니지만).

이 스레드 예상 한 행동을 얻기위한 주요 키로 키를 만들 것을 제안합니다.

이것은 기능입니다. 널 값은 정의되지 않은 값이므로 두 개의 널 값이 동일하지 않습니다. 조금 혼란 스러울 수 있지만 생각할 때 의미가 있습니다.

고유 한 색인은 널이 아닌 값이 고유한지 확인합니다. 열에서 null 값을 허용하지 않도록 지정할 수 있습니다.

다른 팁

추가 트리거/프로그래밍없이 이것을 처리 할 수있는 유일한 방법은 참조 된 각 테이블에 단일 "위의 위의 값"을 갖는 것입니다.

INSERT INTO test VALUES (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM),
                        (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM)

어디에 NO_* 식별자는 ID 열에 적합한 유형/길이입니다. 그러면 예상대로 실패합니다.

mysql null! = null 또는 무엇이든. 그것이 고유 한 것이 작동하지 않는 것입니다. 0과 같은 빈에 다른 기본값을 사용해야합니다.

NULL 값을 해석하고 처리하는 적절한 방법이 있으며 OP에서 나타나는 동작이 정확히 의도된 것임을 아는 것이 중요하다고 생각합니다.귀하는 그 행동을 무시할 수 있고, 나의 반대 없이 원하는 방식으로 귀하의 쿼리를 처리할 수 있지만, 비표준적인 개인적 선호보다는 일종의 모범 사례를 설명하는 답변을 "수락"하는 것이 나을 수도 있습니다.

또는 합의된 모범 사례에 동의하지 않으면 어떤 답변도 수락할 수 없습니다.

가능한 한 빨리 답변을 받기 위한 경쟁이 아닙니다.숙고와 협력도 그 과정의 일부라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top