3.6.6 외부 키의 사용
MySQL에서 InnoDB
테이블에서 외래 키 제약 조건의 확인을 지원하고 있습니다. 제 14 장 "InnoDB 저장 엔진" , 섹션 1.8.2.4 "외래 키 차이" 를 참조하십시오.
2 개의 테이블을 조인하는 경우에만 외부 키 제약은 필요 없습니다. InnoDB
이외의 스토리지 엔진의 경우, 컬럼을 정의 할 때 REFERENCES
어구를 사용할 수 있습니다. 이것은 실제 효과는 없지만 현재 정의하려고하는 컬럼이 다른 테이블의 컬럼을 참조 할 예정이라는 자신의 메모 또는 주석으로 도움이됩니다. 이 구문을 사용할 때는 다음 사항을 이해하는 것이 매우 중요합니다. tbl_name
( col_name
)
MySQL은
col_name
이 실제로tbl_name
에 있는지 (또한 그tbl_name
자체가 존재하는지)를 확인하기위한 어떤CHECK
도 수행하지 않습니다.MySQL은
tbl_name
에 대해 어떤 조치도 수행하지 않습니다. 예를 들어, 정의하려고하는 테이블의 행에 실행 된 작업에 해당하는 행을 삭제하는 것 등은 없습니다. 즉,이 구문은 어떤ON DELETE
동작 및ON UPDATE
동작도하지 않습니다. (REFERENCES
절 일부로ON DELETE
절과ON UPDATE
절을 설명 할 수 있지만이 무시됩니다.)이 구문은 열을 만듭니다. 어떤 인덱스 나 키도 생성하지 않습니다.
이렇게 생성 된 컬럼을 다음과 같이 결합 열로 사용할 수 있습니다.
CREATE TABLE person ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR (60) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE shirt ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, style ENUM ( 't-shirt', 'polo', 'dress') NOT NULL, color ENUM ( 'red', 'blue', 'orange', 'white', 'black') NOT NULL, owner SMALLINT UNSIGNED NOT NULL REFERENCES person (id) PRIMARY KEY (id) ); INSERT INTO person VALUES (NULL 'Antonio Paz'); SELECT @last : = LAST_INSERT_ID (); INSERT INTO shirt VALUES (NULL 'polo', 'blue', @last) (NULL 'dress', 'white', @last) (NULL 't-shirt', 'blue', @last); INSERT INTO person VALUES (NULL 'Lilliana Angelovska'); SELECT @last : = LAST_INSERT_ID (); INSERT INTO shirt VALUES (NULL 'dress', 'orange', @last) (NULL 'polo', 'red', @last) (NULL 'dress', 'blue', @last) (NULL 't-shirt', 'white', @last); SELECT * FROM person; +----+---------------------+ | id | name | +----+---------------------+ | 1 | Antonio Paz | | 2 | Lilliana Angelovska | +----+---------------------+ SELECT * FROM shirt; +----+---------+--------+-------+ | id | style | color | owner | +----+---------+--------+-------+ | 1 | polo | blue | 1 | | 2 | dress | white | 1 | | 3 | t-shirt | blue | 1 | | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | | 7 | t-shirt | white | 2 | +----+---------+--------+-------+ SELECT s.* FROM person p INNER JOIN shirt s ON s.owner = p.id WHERE p.name LIKE 'Lilliana%' AND s.color <> 'white'; +----+-------+--------+-------+ | id | style | color | owner | +----+-------+--------+-------+ | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | +----+-------+--------+-------+
이 방법으로 사용하는 경우 REFERENCES
절은 SHOW CREATE TABLE
또는 DESCRIBE
의 출력에 표시되지 않습니다.
SHOW CREATE TABLE shirt \ G *************************** 1. row ******************** ******* Table : shirt Create Table : CREATE TABLE`shirt` ( `id` smallint (5) unsigned NOT NULL auto_increment, `style` enum ( 't-shirt', 'polo', 'dress') NOT NULL, `color` enum ( 'red', 'blue', 'orange', 'white', 'black') NOT NULL, `owner` smallint (5) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE = MyISAM DEFAULT CHARSET = latin1
REFERENCES
을 이렇게 컬럼 정의의 코멘트 또는 「알림」로서 사용하는 방법은 MyISAM
테이블에서 작동합니다.