본문 바로가기

아카이브/MySQL

[mysql] primary key, foreign key 생성/수정

반응형

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] 으로 생성되는 것입니다. 모든 인덱싱은 오직 한가지의 값만 가지게 됩니다. 
복합인덱싱은 복수개의 컬럼값이 연결된 값으로 인덱스를 생성합니다. 


출처 -  
http://darkstings.blog.me/30033405914





반응형