DB/MySQL

mysql primary key, foreign key 생성 및 수정

linuxism 2012. 3. 17. 13:14
Primary key

Primary Key 2개 설정

CREATE TABLE member (
mem_num INT NOT NULL AUTO_INCREMENT,
mem_id VARCHAR(20), 
 

PRIMARY KEY (mem_num, mem_id)); 


기존 프라이머리 키를 삭제

alter table 테이블명 drop primary key;

 


새로운 프라이머리 키를 설정

alter table 테이블명 add primary key(컬럼명, 컬럼명, 컬럼명 ... );


alter table 테이블명 add primary key(컬럼1, 컬럼2, 컬럼3);
과 같이 프라이머리 키를 생성하면 프라이머리 키의 기준값이 [컬럼1컬럼2컬럼3] 으로 생성되는 것입니다. 모든 인덱싱은 오직 한가지의 값만 가지게 됩니다. 
복합인덱싱은 복수개의 컬럼값이 연결된 값으로 인덱스를 생성합니다. 

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



Foreign key

테이블 생성시 

 

Primary Key2개 잡기

CREATE TABLE Info
(
a bigint(20) unsigned NOT NULL,  
bun char(16) NOT NULL,    
provider tinyint NOT NULL default '0',  
b int NOT NULL default '0',  
PRIMARY KEY (a,b)   
); 

 

-- FOREIGN KEY 추가하는 방법 포함
-- FOREIGN KEY 를 추가할 때 주의사항 3가지
-- INNODB에서의 FOREIGN KEY는 
-- 1.반드시 아버지와 자식은 INNODB 여야 한다.
-- 2.아들이 참조하는 키는 아버지가 가지고 있는 키의 자료형과 동일하게 사용해야 한다.
-- 3.아버지가 UNIQUE한 값을 갖는 키들만, 아들이 가져가서 참조할 수 있다.

 

Foreign key 설정

CREATE TABLE FriendAddInfo   -- 친구 신청 정보
(
abc bigint(20) unsigned NOT NULL,  
def bigint(20) unsigned NOT NULL,  
FOREIGN KEY(abc) REFERENCES UserInfo(a) ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY(def) REFERENCES UserInfo(a) ON UPDATE CASCADE ON DELETE CASCADE 
);

 

ON UPDATE CASCADE, ON DELETE CASCADE는 참조한 원본 테이블이 UPDATE, DELETE의 이벤트가 발생하면 변경사항을 자동으로 반영한다.

출처 - 
http://blog.naver.com/xenoheart?Redirect=Log&logNo=130129181680 


FOREIGN KEY (외래키) 다른 테이블의 필드값을 참조한다.

MySQL 사이트에 예제를 보고 설명하면

===================================
 

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;

===================================

child 테이블은 parent 테이블의 id 값을 참조로 하게됩니다.

쉽게 얘기해서 parent 테이블에 없는 id값은 child 테이블의 parent_id 값으로 사용되지 못 하는 거죠.
 

FOREIGN KEY는 가비지 데이터를 줄이고 정보의 신뢰를 높일 수 있지만 값이 있는 지 없는 지 확인 하기 때문에 부모 테이블이 비대할 경우 속도를 저하시킬 수 있습니다.
 

저는 개인적으로 결제의 경우와 같이 중요한 것이 아니면 사용하는 걸 자제합니다. 데이터의 신뢰도 중요하지만 웹은 속도도 무척 중요하죠.^^

 

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name, ...)
    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]

참고) http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html