2008-10-25 5 views
19

나는 지난 몇 주간 SQL을 천천히 배우고있다. 나는 모든 관계형 대수와 관계형 데이터베이스가 어떻게 작동하는지에 대한 기본 사항을 선택했습니다. 내가 지금하고있는 일은 구현 방법을 배우는 것입니다.MySQL의 외래 키?

나는 MySQL에서 외래 키를 발견했습니다. MySQL이 가지고있는 InnoDB 스토리지 스키마에 다른 것들이 많이 있다는 것을 알 수는 없습니다.

MySQL에 구현 된 외래 키의 간단한 예는 무엇입니까?

다음은 필자가 작성한 스키마의 일부로, 실용적인 예를 보여주는 것보다 내 결함을 지적하려는 경우에는 작동하지 않는 것 같습니다.

CREATE TABLE `posts` (
`pID` bigint(20) NOT NULL auto_increment, 
`content` text NOT NULL, 
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
`uID` bigint(20) NOT NULL, 
`wikiptr` bigint(20) default NULL, 
`cID` bigint(20) NOT NULL, 
PRIMARY KEY (`pID`), 
Foreign Key(`cID`) references categories, 
Foreign Key(`uID`) references users 
) ENGINE=InnoDB; 

답변

19

당신의 범주와 테이블이 이미 존재하고 기본 키로 각각 CID 및 UID를 포함하는 사용자를 가정 할 때,이 작업을해야합니다 :

CREATE TABLE `posts` (
`pID` bigint(20) NOT NULL auto_increment, 
`content` text NOT NULL, 
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
`uID` bigint(20) NOT NULL, 
`wikiptr` bigint(20) default NULL, 
`cID` bigint(20) NOT NULL, 
PRIMARY KEY (`pID`), 
Foreign Key(`cID`) references categories(`cID`), 
Foreign Key(`uID`) references users(`uID`) 
) ENGINE=InnoDB; 

열 이름은 references 절에 필요합니다.

+0

굉장합니다, 감사합니다. – icco

3

This에는 자체적으로 외래 키를 만드는 방법과 CREATE TABLE에서 일부 코드가 있습니다.

여기 것과 간단한 예제 중 하나입니다 :

CREATE TABLE parent (id INT NOT NULL, 
       PRIMARY KEY (id) 
) ENGINE=INNODB; 
CREATE TABLE child (id INT, parent_id INT, 
        INDEX par_ind (parent_id), 
        FOREIGN KEY (parent_id) REFERENCES parent(id) 
         ON DELETE CASCADE 
) ENGINE=INNODB; 
2

로버트에 동의합니다. references 절에서 열의 이름이 누락되었습니다 (오류 150이 발생해야 함). 난 당신이 테이블에 현실에서 생성 됐는지 확인 할 수있는 추가 할 것입니다 :

SHOW CREATE TABLE posts; 
8

편집 : 당신은 외래 키 제약 조건에 참조 된 컬럼의 이름을 선언 할 필요가 로버트 Vinko 상태. 이것은 표준 SQL에서 부모 테이블에서 같은 이름 인 경우 참조 된 열 이름을 생략 할 수 있지만 InnoDB에서 필요합니다.

  • 이노 디비 엔진을
  • 포함되지 않습니다 MySQL 설치가 당신의 MySQL의 설정 파일하지 않는
  • : 내가 MySQL의에서 만난

    하나의 특질은 외래 키 선언은 여러 상황에서 자동으로 실패한다는 것입니다 당신은 ENGINE = InnoDB의 테이블 수정과 테이블을 선언하지 않는 이노 엔진

  • 수 있도록
  • 외래 키 열입니다 참조 테이블의 기본 키 컬럼과 같은 데이터 유형이 정확히

불행히도 MySQL은 외래 키 제약 조건을 만들지 못했다는 메시지를 표시하지 않습니다. 단순히 요청을 무시하고 외래 키가없는 테이블을 만듭니다 (SHOW CREATE TABLE 게시물 인 경우 외래 키 선언이 표시되지 않음). 난 항상 이것이 MySQL의 나쁜 기능이라고 생각했습니다!

팁 : 정수 데이터 형식 (예 : BIGINT (20))의 정수 인수는 필요하지 않습니다. 스토리지 크기 나 열의 범위와는 아무런 관련이 없습니다. BIGINT는 인수에 관계없이 항상 같은 크기입니다.숫자는 ZEROFILL 열 수정자를 사용할 경우 MySQL이 열을 채우는 자릿수를 나타냅니다.

+0

외래 키의 열 이름에 관한 귀하의 주장에 대한 참조를 제공 할 수 있습니까? 구문에 따르면 (http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html) 이것은 선택적 매개 변수가 아니며, 그것을 지정하십시오. –

+0

네, 맞습니다. 이제 나는 똑같은 것을 지켜 보았습니다. 표준 SQL은 참조 된 컬럼 이름이 기본 테이블에서 동일 할 경우 암시 적으로 허용하지만, InnoDB는이를 지원하지 않습니다. Mea culpa! –

+0

제 첫 단락을 더 정확하게 편집했습니다. –

1

이전 답변은 외래 키 제약 조건을 다룹니다. 외래 키 제약 조건은 참조 무결성을 유지하는 데 확실히 유용하지만 "제약 조건 사용 여부"에 관계없이 "외래 키"개념 자체는 관계형 데이터 모델의 기본 요소입니다.

equijoin을 수행 할 때마다 외래 키를 일반적으로 참조하는 키와 동일시합니다. 예 :

select * 
from 
    Students 
inner join 
    StudentCourses 
on Students.StudentId = StudentCourses.StudentId 

StudentCourses.StudentId는 Students.StudentId를 참조하는 외래 키입니다.

+0

당신이 이것을 조금 더 설명 할 수 있다고 생각합니까? 그냥 조인입니까? – icco