primary key -> 테이블 스키마를 따르는 레코드들이 구분될 수 있도록 하는 attribute(s).
primary key로 지정된 attribute(s)은 자동적으로 제약조건, unique, not null 형식이 추가된다. (trivial)
foreign key -> 다른 테이블의 스키마 구조를 따르는 레코드를 참조하는 attributs(s).
다른 테이블에 존재하는 attribute를 references 해야한다. (trivial)
ex)
CREATE TABLE MEMBER_SCHEME (
MEMBER_ID VARCHAR(20) PRIMARY KEY,
MEMBER_PW CHAR(40) NOT NULL,
MEMBER_EMAIL VARCHAR(30) NOT NULL,
MEMBER_NICKNAME INT(11) UNIQUE
);
CREATE TABLE GAME_SCHEME (
GAME_CODE TINYINT(4) PRIMARY KEY,
GAME_THUMBNAIL CHAR(40) NOT NULL
);
CREATE TABLE SCORE_SCHEME (
MEMBER_ID VARCHAR(20),
GAME_CODE TINYINT(4),
GAME_SCORE INT(11),
PRIMARY KEY(MEMBER_ID, GAME_CODE),
FOREIN KEY(MEMBER_ID) REFERENCES(MEMBER_SCHEME) ON UPDATE CASCADE ON DELETE CASCADE,
FOREIN KEY(GAME_CODE) REFERENCES(GAME_SCHEME) ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE TABLE ITEM_SCHEME (
ITEM_CODE TINYINT(4) PRIMARY KEY,
ITEM_NAME VARCHAR(20) NOT NULL,
ITEM_DESCRIPTION VARCHAR(50),
ITEM_THUMBNAIL CHAR(40) NOT NULL
);
*ON UPDATE CASCADE, ON DELETE CASCADE는 "참조되고 있는 테이블"이 UPDATE, DELETE 명령이 수행되면 그 변경사항을 자동으로 반영하도록 한다. -> '참조하는 테이블' 에서 primary key로 사용되는 경우 문제가 될 수 있다. primary key 속성을 갖는 tuple이나 attribute가 변하는 것이기 때문. 에러발생의 여지가 높다.
*FOREIGN KEY는 데이터를 효율적으로, 정보의 신뢰를 높일 수 있다. 하지만 그것을 보장하기 위한 tradeoff로서, 항상 값이 있는 지 없는 지 확인 하기 때문에 부모 테이블이 비대할 경우 속도저하의 문제가 생긴다.
추가내용)
primary key 삭제
alter table 테이블명 drop primary key;
primary key 설정
alter table 테이블명 add primary key(컬럼명, 컬럼명, 컬럼명 ... );
alter table 테이블명 add primary key(컬럼1, 컬럼2, 컬럼3);
과 같이 프라이머리 키를 생성하면 프라이머리 키의 기준값이 [컬럼1컬럼2컬럼3] 으로 생성되는 것입니다. 모든 인덱싱은 오직 한가지의 값만 가지게 됩니다.
복합인덱싱은 복수개의 컬럼값이 연결된 값으로 인덱스를 생성합니다.
'아카이브 > MySQL' 카테고리의 다른 글
자주 참고하는(깜박하는) 쿼리문들 (0) | 2015.02.13 |
---|---|
[Trigger] 외부 프로그램을 호출하기 위해 시도한 트리거기능 (0) | 2015.02.01 |
[Mysql] 데이터베이스 한글 설정 (0) | 2015.01.22 |
[mysql] 백업/복구 (0) | 2015.01.22 |
[MySQL] (0) | 2015.01.12 |