SQL Server 2008에서
TableA(A_ID, A_Data)
TableB(B_ID, B_Data)
ViewC(A_or_B_ID, A_or_B_Data)
그것을 정의 할 수 TableZ(A_or_B_ID, Z_Data)
있도록 Z.A_or_B_ID
열이 검색된 값으로 제한된다 ViewC
? 뷰에 대한 외래 키로이 작업을 수행 할 수 있습니까?
답변:
외래 키에서 뷰를 참조 할 수 없습니다.
A_or_B_ID
TableZ에서 정말 필요한 경우 두 가지 유사한 옵션이 있습니다.
1) 테이블 z에 nullable A_ID
및 B_ID
열을 A_or_B_ID
추가하고,이 두 열에 ISNULL을 사용하여 계산 된 열을 만들고 , 둘 중 하나만 A_ID
또는 B_ID
null이 아닌 CHECK 제약 조건을 추가합니다.
2) 현재 A 또는 B 중 어느 하나를 포함하는 제약 생성 테이블 (Z)에 TABLENAME 열을 추가 A_ID
하고 B_ID
그들의 적절한 테이블 () CASE 식을 사용하여 이름이 유일한 비 - 널이다 계산 열로. 그들도 계속 유지하십시오
두 경우 모두 기본 테이블에 대한 적절한 외래 키를 가질 수있는 A_ID
및 B_ID
열이 있습니다. 차이점은 계산되는 열에 있습니다. 또한 2 개의 ID 열의 도메인이 겹치지 않는 경우 위의 옵션 2에서 TableName이 필요하지 않습니다. 단, 케이스 표현식이 어떤 도메인 A_or_B_ID
에 속 하는지 결정할 수있는 한
(내 서식 수정에 대한 의견에 감사드립니다)
A_or_B_ID
다른 옵션이 있습니다. TableA 및 TableB를 TablePrime이라는 새 테이블의 하위 클래스로 취급합니다. TableB의 ID 값이 TableA의 ID 값과 일치하지 않도록 조정합니다. TablePrime의 ID를 PK로 만들고 TableA 및 TableB의 모든 (조정 된) ID를 TablePrime에 삽입합니다. TableA와 TableB가 PK에서 TablePrime의 동일한 ID에 대한 FK 관계를 갖도록합니다.
이제 상위 유형 / 하위 유형 패턴이 있으며 TablePrime (-A- 또는 -B 중 하나 를 원하는 경우 ) 또는 개별 테이블 중 하나 ( A 만 또는 B 만 원하는 경우)에 제약 조건을 만들 수 있습니다. .
더 자세한 정보가 필요하시면 문의하십시오. A와 B가 상호 배타적인지 또는 작업중인 것이 동시에 둘 다일 수 있도록하는 변형이 있습니다. 가능하면 FK에서 공식화하는 것이 가장 좋습니다.
값이 존재하면 true를 반환하고 그렇지 않으면 false를 반환하는 fCheckIfValueExists (columnValue)라는 사용자 정의 함수를 참조하는 제약 조건을 추가하는 것이 더 쉽습니다.
장점은 여러 열을 수신하고, 계산을 수행하고, null을 허용하고, 기본 키에 정확하게 일치하지 않는 값을 허용하거나, 조인 결과와 비교할 수 있다는 것입니다.
단점은 옵티마이 저가 모든 외래 키 트릭을 사용할 수 없다는 것입니다.
죄송합니다. 엄밀히 말하면 뷰에 외래 키를 설정할 수 없습니다. 그 이유는 다음과 같습니다.
InnoDB는 외래 키를 특징으로하는 MySQL 용 내장 스토리지 엔진입니다. 모든 InnoDB 테이블은 engine = 'InnoDB'로 information_schema.tables에 등록됩니다.
information_schema.tables에 등록 된 뷰에는 NULL 스토리지 엔진이 있습니다. MySQL에는 정의되지 않은 스토리지 엔진이있는 테이블에 외래 키를 포함하는 메커니즘이 없습니다.
감사!