2012-10-01 5 views
6

테이블의 외래 키를 다른 테이블의 복합 기본 키의 일부로 포함 할 수 있습니까?SQL 테이블 복합 기본 키의 일부인 외래 키

프로젝트 테이블 : :

Composite Primary Keys: UserId, ProjectId (둘 다 독특한 없습니다 나는 두 개의 테이블이있는 경우 는 예를 들어, 하나는 다른 사용자의 모든 활성 프로젝트와 프로젝트에서 사용하고 어떤 장비에 대한 또 다른 정보를 포함에 대한 정보가 들어

Composite Primary Keys: UserId, ProjectId, EquipmentId (도

지금이다) 그 자체로 고유은 포 :

장비 표) 자체로 장비 테이블의 ProjectId를 프로젝트 테이블의 외래 키로 설정할 수 있습니까? 시도 할 때 프로젝트 테이블의 열이 기존 기본 키 또는 고유 제한 조건과 일치하지 않는다는 오류가 표시됩니까?

+0

어떻게 복합 기본 키를 정의 했습니까? _each_ 열에 고유 제한 조건을 추가 했습니까? – Oded

+0

하지만 각 열이 고유하지 않기를 바랍니다. 고유 한 두 개 또는 세 개의 열의 조합을 원합니다. – Tony

+0

제약 조건을 어떻게 정의했는지 물었습니다. 나는 당신이 그런 식으로 정의해야한다고 말하지 않았다. – Oded

답변

8

당신이 외부 키를 생성 번호

, 당신이 "점을"다른 테이블에 UNIQUE 또는 PRIMARY KEY 제약 있어야합니다 키. 중복 값을 허용하는 열을 가리키는 외래 키를 설정할 수 없습니다. 다른 테이블 (예를 들어)에서 중복 값 중 하나를 업데이트하는 경우 데이터가 "작동해야하는 방식"을 상상하는 것은 매우 어려울 것입니다.

ProjectID가 UNIQUE 또는 PRIMARY KEY 인 Projects 테이블을 설정 한 다음 의 외래 키를 모두의 해당 테이블에 연결해야합니다.

"기본 키"라는 용어를 사용하면 기본 키를 구성하는 각 테이블의 열을 설명 할 수 있습니다. 실제로 각 테이블에는 하나의 기본 키만있을 수 있습니다. 이 키는 하나 이상의 열로 구성 될 수 있지만 키 자체는 여전히 단수로 참조됩니다. 기본 키를 사용하여 검색을 최적화 할 때 중요한 차이가 있습니다.

-1

@Larry Lustig 외래 키는 다른 테이블의 기본 키의 일부일 수 있습니다.

소스 : 테이블 간의 Dependent relationship

확인 관계 : Zdarzenie (이벤트) 및 TypZdarzenia (이벤트 유형)

football Competition - database

0

그 좋은 디자인 연습의 경우는 모르겠지만 확실히 그것을 다른 테이블의 복합 기본 키의 일부인 하나의 테이블의 복합 외래 키를 가질 수 있습니다.

우리가 가지는 test2에 말하는 복합 기본 키 (A가 B)

이제 우리는 테이블 수를 갖는 테이블 TEST1이 말 주키 (P, Q, R) 여기서 (P, Q)의에 test2는 test2의 (A, B)를 참조합니다.

MySql 데이터베이스에서 다음 스크립트를 실행했지만 정상적으로 작동합니다.상술 한 경우

CREATE TABLE `test2` (
`P` INT NOT NULL, 
`Q` VARCHAR(2) NOT NULL, 
`R` INT NOT NULL, 
`S` DATETIME NULL, 
`T` VARCHAR(8) NULL, 
PRIMARY KEY (`P`, `Q`, `R`), 
INDEX `PQ_idx` (`P`,`Q` ASC), 
CONSTRAINT `PQ` 
    FOREIGN KEY (`P`, `Q`) 
    REFERENCES `test1` (`A`,`B`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 


CREATE TABLE `test1` (
`A` INT NOT NULL, 
`B` VARCHAR(2) NOT NULL, 
`C` DATETIME NULL, 
`D` VARCHAR(45) NULL, 
PRIMARY KEY (`A`, `B`)); 

는 데이터베이스의 조합 기대 (A를 B) 고유하게 그리고 TEST1 테이블의 기본 키되고있다.


하지만 당신은 다음과 같은 뭔가를하려고하면, 스크립트는 실패합니다. 데이터베이스에서는 test2 테이블을 만들 수 없습니다. 조합이 (A는, B)이 고유 한 경우는 중요하지 않으며 상술 한 사례 데이터베이스의

CREATE TABLE `test2` (
`P` INT NOT NULL, 
`Q` VARCHAR(2) NULL, 
`R` DATETIME NULL, 
`S` VARCHAR(8) NULL, 
`T` VARCHAR(45) NULL, 
    INDEX `P_idx` (`P` ASC), 
    INDEX `Q_idx` (`Q` ASC), 
    CONSTRAINT `P` 
    FOREIGN KEY (`P`) 
    REFERENCES `test1` (`A`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `Q` 
    FOREIGN KEY (`Q`) 
    REFERENCES `test1` (`B`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 

열 A는 각각 고유 한 기대와 동일한 컬럼 B. 대한 따른다.