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

'DB > MySQL' 카테고리의 다른 글

MySQL에서 문자셋(Character Set)과 Collation의 차이  (0) 2012.03.17
mysql 주석  (0) 2012.03.17
mysql root 패스워드를 변경  (0) 2012.03.16
MySQL ALTER TABLE 구문 정리  (0) 2012.03.16
MySQL flush privileges 명령어  (0) 2012.01.24
Posted by linuxism
,

회원 정보 테이블을 만들 적에  

대부분 하나의 테이블에 사용자 정보 ( 이름/전화번호/주소/이메일 등등 ) 을 모두 몰아 넣는 경우가 있는데

이는 좋지 않은 방법이다.

 

안좋은 케이스를 예로 들자면

회원 테이블 하나만  유출 된다 하더라도  모든 회원 정보가 유출 되는 결과가 발생한다.

( 이게 아니라도 하나의 테이블에 사용자 정보가 함께 존재할 시에 감사에 걸린다. )

 

때문에 개인 정보마다 하나의 테이블을 생성 한 후에

각각의 유저마다 구분되는 키값으로 릴레이션을 거는 것이 좋다.

 

유저마다 구분되는 키값으로 보통 사용자 아이디를 생각하는 경우가 많은데

이 또한 그다지 좋은 방법은 아니다.

 

예를 들어 사용자 아이디를 PK로 사용할 경우에

사용자가 탈퇴를 하게 되면 곤란한 경우가 생긴다.

( 탈퇴한 사용자 정보를 삭제할 것인지, 보관할것인지

  어떻게 취급 할지도 함께 생각해 봐야 할 문제. )

 

탈퇴한 사용자의 아이디를 그 후에 가입한 사용자가 다시 사용한다고 생각해 보자.

분명 탈퇴한 사용자와 새로 가입한 사용자는 아이디는 같을지 모르겠지만 다른 사용자다.

그런데 이럴 경우 예전에 썼던 글을 사용자 아이디로 검색 해보면

이전 사용자가 썼던 글들이 검색되는 경우가 발생한다.

 

때문에 사용자 아이디도 유니크한 값으로 취급 되어야 겠지만

PK는 겹치지 않는 값 ( 예를 들어 난수를 발생시킨다거나) 으로 사용하는 것이 좋다.

 

PK로 겹치지 않는 값을 사용하며, 이 값을 가지고 다닌다면

위와 같은 상황에서도 아이다가 같다해도 구분되는 PK값은 다르기 때문에

예전 탈퇴한 사용자의 글이 검색되는 일은 없을 것이다.

 

비밀번호나 주민등록번호등의 개인 정보를 보관 할 때에는

해쉬알고리즘을 사용하거나 (MD5나 SHA1 등) 해야지 암호화는 하지 말아야 한다.

암호화 한다는 말은 복호화가 가능하다는 말과 동일하다.

 

자주 쓰이는 컬럼은 인덱스로 지정하여 검색 비용을 줄이는 것도 잊지 말자.

 

컬럼명에 숫자를 쓰는 일은 없도록 하자 

또한 fk로 지정된 컬럼이라고 혹여 fk_id 라는 식으로 앞에 fk라 명명 하는 일도 없도록 하자.

fk인것은 알수 있을 지언정, 어차피 컬럼명만 봐서는 어떤 테이블과 관계를 맺고 있는지 유추는 불가능하다.

( 한마디로 부질 없는 짓이다 )

 


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


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

질문

<회원 테이블>

 

-------------------

회원번호(PK)

-------------------

회원ID

비밀번호

이름

주민번호

.

.

.

-------------------

 

위와 같이 회원테이블이 어느 한 인터넷 포털 사이트에서 사용되어진다라는 가정하에..

 

회원 ID 컬럼 또한 유니크해야 하기때문에 충분히 기본키로 사용이 가능할텐데도..

 

굳이 회원번호라는 컬럼을 추가시켜 가면서까지  기본키로 선정하는 이유는 무엇인가요?

 

어느 한 강의 파일에서 저러한 내용이 나오길래 궁금해서 질문 드립니다.

 

그 강의 내용에서는..

 

"회원ID 컬럼을 기본키로 선정할 경우, 다른 테이블에서 회원ID를 참조키로 전이되어지게

되고 그러할 경우 한 회원이 탈퇴를 수행했을때 기존에 사용되었던 회원ID는 할당받지

못하도록 제약을 받게 된다."

 

대충 이런 식으로 설명을 하던데..

 

도저히 무슨 이야기인지 이해가 가질 않습니다.

 

답답한 마음에 이렇게 질문 올리는데..

 

쉽게 풀이해서 설명 좀 부탁드릴께요.


답변

강의내용과 같은 요건이 있다면 다음의 예와 유사한 case일 듯 하군요...;

회원번호는 numbering하여 매긴다고 가정하고, 회원ID는 회원가입 시 사용자들이 입력하는 로그인ID라고 가정하면 쉽겠네요.

 

편의상 회원테이블과 로그인한 내역을 관리하는 테이블만 가정합시다.

만약 'aa'라는 ID로 회원이 가입했을 경우, 로그인내역에 FK로 회원ID를 잡아 놓을 경우,

회원이 탈퇴를 하면 다른 회원이 'aa'라는 ID를 사용할 수 있어야 하는데 기존의 로그인내역에 'aa'의 ID로 데이터들이 있으니 이 내역들을 다 삭제하기 전에는 회원ID 'aa'를 삭제 할 수 없겠지요? 무결성을 무시하고 회원의 'aa'를 삭제 한다고 해도 다른회원이 'aa'로 가입하여 로그인하면 기존의 'aa' 로그인 데이터와 나중의 'aa' 로그인 데이터가 누가 누구의 데이터인지 구분할 수 없게 됩니다. 그렇다고 로그인내역에 회원명이나 주민번호컬럼등을 더 만드는 것은 데이터무결성에 또 다른 문제를 발생하게 됩니다.

 

이런 요건의 경우 회원번호를 number(22), 회원ID를 char(10) 정도로 관리하고 로그인내역의 FK를 회원번호와 연결시키면 위의 문제가 발생하지 않습니다.

물론 신규회원가입 시 회원번호는 그때마다 새로 따야합니다.

(회원번호가 회원의 unique key니 당연한 말이지요?)

 

이렇게 관리할 경우, 탈퇴하지 않은 회원 중 'aa'를 사용하는 회원이 없다면 기존의 이력데이터들의 존재 유무와 무관하게 신규회원은 'aa'라는 ID를 사용할 수 있습니다.

다만 가입회원ID Check시 탈퇴하지 않은 데이터중에 같은 회원ID가 있으면 중복오류를 내는 인덱스나 아래의 쿼리등의 장치는 추가로 필요하겠지요?

SELECT CASE WHEN COUNT(*) > 0 THEN '가입불가' ELSE '가입가능' END

FROM 회원

WHERE 회원ID = :가입할회원ID

  AND 탈퇴여부 <> 'Y'; --> 탈퇴하지 않은 회원 중 가입할 ID를 사용하는 사람이 있는지 조사

 

제가 글 표현력이 딸려서 이해가 잘 되셨을지 모르겠군요...;

 

건승하시길...수고하세요~~



출처 - 네이버 지식









'DB > Common' 카테고리의 다른 글

데이터베이스 설계 과정 1  (0) 2012.03.28
테이블 설계 시 고려 사항  (0) 2012.03.17
SQLite  (0) 2012.03.02
varchar와 varchar2의 차이와 number(5,2) 의미  (1) 2012.02.13
CHAR()와 VARCHAR2() 차이  (0) 2012.02.13
Posted by linuxism
,

1. mysql root 패스워드를 변경해보자(리눅스)

 

<우선 mysql start 하기>

mysql설치루트/bin>./mysqld_safe &

 

<mysql 접속하기>

mysql설치루트/bin>./mysql -u root mysql

 

<password 변경하기>

mysql> use mysql;

 

mysql> update user set password=password('new-passwd') where user = ('root');

 

mysql> flush privileges;

(참고 : update문을 사용하여 암호가 바뀌었을땐 flush privileges를 이용하여 사용자 관련 테이블에 알려야 함)

 

마지막으로 서버 재실행

 

 

2. 패스워드 분실시

 

패스워드 분실시 빠르게 root 패스워드를 변경 해보자

 

우선 mysql를 stop 한 환경에서 작업을 해야 한다.

 

<권한 테이블을 사용하지 않겠다고 선언하면서 서버 start>

mysql설치루트/bin> ./mysqld_safe --skip-grant-tables &

 

<mysql 데이터베이스로 바로 접속>

mysql설치루트/bin>./mysql -u root mysql

 

<update문으로 패스워드 변경>

mysql>update user set password=password('new-passwd') where user = 'root';

 

<mysql 접속 종료>

mysql>quit

 

<mysql stop하기>

mysql설치루트/bin>./mysqladmin -u root -p shutdown

 

<mysql 재시작>

mysql설치루트/bin>./mysqld_safe &

 

<mysql 접속하기>

mysql설치루트/bin>./mysql -u root -p

password:

 

mysql>


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


오늘은 MySQL의 비밀번호를 분실 했을 시 패스워드를 강제로 변경하는 법에 대해서 포스팅 하려고 한다.

현재 local의 root 계정이 재부팅시에 계속 변경되는데 이 문제점을 해결할 수 있는 방법을 찾지 못하여
DBMS를 사용할 때 마다  계정의 비밀번호를 변경하는 일시적인 방법으로 사용하고 있다.

이 때 root 계정의 비밀번호를 변경하는 방법을 사용하는데 사용시마다 명령어 확인을 위해 검색을 이용하게 되는데
그 방법에 대해서 자세히 알아보자.

1. mysqld.exe 데몬 종료
 
윈도우를 사용하는 유저라면 한번쯤은 ctr + alt + del 키를 눌러봤을 법하다. 거기서 프로세스 탭을 클릭하고 mysqld.exe 프로세스를 강제 종료한다.

 
2. cmd에서 mysqld.exe 재시작

mysqld.exe를 종료했다면 그 다음은 cmd를 실행하여 mysql이 설치된 경로로 접근한다. 그 후 mysql\bin폴더로 접근하여
폴더에 있는 mysqld.exe를 실행하게 되는데 이 때 명령어를 살펴보자.


mysqld.exe --skip-grant
   

 

3. mysql.exe 실행 
이렇게 실행하면 cmd 창이 멈춘듯한 결과가 나타나는데 정상적으로 작동하는 것이니 실행한 창을 놔두고 새로운 cmd창을 실행한다. 그 후 새로운 cmd 창에 아래 명령문을 입력한다. 

mysql.exe 

 

이렇게 하면 아이디와 비밀번호 없이도 mysql을 실행할 수 있다.
여기서 사용할 데이터 베이스를 선택하는 쿼리를 실행한다. 이는 아래와 같다.

use mysql;

 


그 후 쿼리문을 통해 비밀번호를 강제 수정하게 되는데 이 명령문은 아래와 같다.
 
UPDATE user SET password=password('변경할 비밀번호') WHERE user = '변경할 계정 이름'; 
 
ex>update user set password=password('1') where user='root';



이런식으로 쿼리문을 작성하여 실행 한다. 간단히 쿼리문을 보자면 user 테이블의 password 컬럼을 수정하는데 이 때 유저 컬럼의 데이터가 root 인것을 수정한다는 것이다. 너무 간단한 쿼리여서 설명하기도 민망하다.
여기서 끝이 아니다.
권한을 바로 적용하기 위해서 한가지 명령문을 더 쓰는데 이는 아래와 같다.

flush privileges;

 


이렇게 하면 password가 변경되고 mysql -u root -p1 이라는 cmd 창에서의 실행으로 정상적인 접근이 가능하다. 

출처 -  http://hiphop9n.tistory.com/29 



Posted by linuxism
,