MySQL에서는 그냥 아무 생각없이 스키마를 만들게 되면 Foreign Key를 만들 수가 없다.
그래서 오늘은 MySQL에서 Foreign Key를 만드는 방법을 알아보자.

  1. 먼저 foreign key의 reference가 될 스키마를 만든다.
    여기에서는 테이블 이름은 test_student로 했고, 학번이 PK이다. 스키마를 생성할 때에 Storage Engine을 MyISAM이 아닌 InnoDB로 해줘야 한다.
    만약 MyISAM으로 스키마를 만들 경우에는 FK가 지원되지 않는다고 한다.


  2. 다음으로 foreign key가 존재할 스키마를 만든다.
    이 때에도 Storage Engine을 InnoDB로 하고, 스키마의 이름은 test_foreign으로 해주었다.
    그리고 중요한 것이 FK로 할 속성의 경우, FK속성이 다른 속성과 함께 PK이거나 Index항목을 체크해주어야 한다.
    PK가 되면 자동으로 Index가 등록되는데, 이런 내용으로 보아서는 FK가 될 속성은 반드시 Index가 등록되어야 하는 것으로 보인다.



  3. test_foreign 스키마를 생성한 후에 탭을 누르면 아래와 같은 화면을 확인할 수 있을 것이다.



    여기에서 를 누르면 아래 그림과 같은 화면이 나타난다.

    위의 화면에서 학번을 FK로 하고 싶으면 "학번" 옆에 있는 드랍박스에서 test_student->학번을 선택하면 현재 테이블의 학번 속성을 FK로 하는데 참조를 test_student의 학번 속성으로 하겠다는 의미이다.



    또 여기에서 ON DELETE부분과 ON UPDATE부분이 있는데 이 부분의 값을 어떻게 주냐에 따라서 동작 방식이 달라진다.
    ON DELETE는 참조하는 테이블의 투플이 삭제됐을 때 어떻게 할 것인지를 결정하는 부분이고, ON UPDATE는 참조하는 테이블의 투플이 update되었을 때 어떻게 할 것인지 동작 방식을 결정하는 부분이다.

    아직 이 부분의 값을 변경해가며 써보지 않아서 정확히는 알 수 없지만, 대충 짐작해 보면 ON DELETE에 CASCADE로 되어 있으면 참조의 대상이 되는 테이블의 투플을 delete하는 경우가 발생했을 때에 그를 참조하는 투플을 같이 지우고, ON UPDATE가 CASCADE이면 참조의 대상이 되는 테이블의 투플을 update하는 경우에 그를 참조하는 투플을 같이 지우는 것 같다.
    SET NULL의 경우에는 참조의 대상이 되는 테이블에서 해당 쿼리를 수행하면 그를 참조하는 테이블의 투플의 속성 부분이 NULL 값으로 셋팅되는 것으로 예상된다.
    NO ACTION의 경우에는 참조의 대상이 되는 테이블에서 해당 쿼리를 수행하더라도 그를 참조하는 테이블에서 아무 일도 하지 않을 것으로 예상된다.
    RESTRICT는 잘 모르겠다.;;

신고

'프로그래밍 > DataBase' 카테고리의 다른 글

MySQL에서 Foreign Key 만들기  (1) 2010.01.04
Posted by Code-Moon

댓글을 달아 주세요

  1. ㅇㅇ 2013.07.08 17:17 신고 Address Modify/Delete Reply

    restrict 는 참조하고있으면 변경,삭제 불가

MySQL에 있는 DB 인스턴스를 파일로 저장하고 싶은 경우가 있을 것이다. 그럴 경우에는 다음의 명령을 사용해 보자.

 

echo "select * from 테이블 이름" | mysql –u 아이디 –h 호스트 주소 –p 디비 이름 > 출력 파일명;

 

리눅스 쉘에서 위와 같이 입력을 하면 파일에 DB의 인스턴스가 저장된다.

예를 들어 mysql의 아이디가 donxu이고 DB이름도 donxu, 테이블 이름은 donxu_board, 출력 파일을 board.txt로 한다고 하면 명령어는 다음과 같이 될 것이다.

 

echo "select * from donxu_board" | mysql –u donxu –h localhost –p donxu > board.txt;

 

이걸 해보고 나서 알게 된 사실인데 굳이 리눅스 쉘에서 위의 명령을 실행하지 않더라도 MySQL을 사용한다면 웹 브라우저에서 MySQL로 접속하여 내보내기(Export)를 누르면 원하는 형식의 파일로 저장할 수 있다.-_-;;;;

신고

'프로그래밍 > Linux' 카테고리의 다른 글

Cron을 이용해서 특정 시점에 작업 수행하기  (9) 2010.07.01
Vi에디터 단축 키  (0) 2010.01.04
리눅스 shell에서 mySQL의 instance가져오기  (0) 2010.01.04
Vi설정하기  (0) 2010.01.04
Posted by Code-Moon

댓글을 달아 주세요

이번에 DB텀을 하면서 우리 동아리(untoC) 서버에서 작업을 하게 됐다.
왜냐하면 기본적인 서버 환경이 다 갖추어져 있기 때문이었다. Php, mysql, apache, …등이 다 설치가 되어 있기 때문에 그냥 쓰기만 하면 되는 상황이었다.
그래서 자연스럽게 php파일을 만들었는데 이게 무슨 일???!!!

한글이 깨지는 것이었다!!!!

 

처음에는 서버의 환경 설정 문제일 거라 생각했다. 구글링을 하면서 엄청나게 찾아 헤맸지만 절대 답을 찾을 수 없었다.

구글링을 통해 알아낸 몇가지 사실은 다음과 같다.

이렇게 한글이 깨지는 문제는 character set의 설정 문제인데 이는 php, mysql, apache에서 각각 설정을 다 해줘야 하는 부분이었다.

 

  • 먼저 php설정은 etc폴더에 있는 php.ini 파일.
    php.ini파일에서 수정해야 하거나 추가해야 하는 부분은 아래와 같다.

default_charset = "UTF-8"

mbstring.language = UTF-8

mbstring.internal_encoding = UTF-8

mbstring.http_input = auto

mbstring.http_output = UTF-8

mbstring.encoding_translation = On

mbstring.detect_order = auto

mbstring.substitute_character = none;

 

  • Mysql설정은 etc폴더에 있는 my.cnf 파일
    my.cnf파일에서 수정해야 하거나 추가해야 하는 부분은 아래와 같다.

[mysqlId]부분

default-character-set = utf8

 

[client] 부분

character-set = utf8

 

  • Apache설정은 etc/httpd/conf폴더에 있는 httpd.conf 파일
    httpd.conf파일에서 수정해야 하거나 추가해야 하는 부분은 아래와 같다.
    AddDefaultCharset의 경우에는 어떤 웹에서는 UTF-8로 설정해야 한다고 하고, 또 다른 사이트에서는 추가하면 화면이 깨질 수 있다고 하니 주의하자.

AddDefaultCharset UTF-8

 

  • etc/sysconfig 폴더에 있는 i18n 파일
    i18n파일에서 수정해야 하거나 추가해야 하는 부분은 아래와 같다.

LANG="ko_KR.UTF-8"
SUPPORTED="ko_KR.UTF-8:ko_KR:ko"

export LANG="ko_KR.UTF-8"

 

  • html 또는 php파일(웹 페이지 파일)
    우리가 웹에 보여주고 싶은 페이지에는 <head>태그 사이에 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>이라고 적어줘야 한다.

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

</head>

 

그런데 위의 과정들을 아무리 보고 수정해보아도 도저히 바뀌는 건 없었다. 여전히 한글 대신에 이상한 말들만 떠 있었다.
그래서 고심 끝에 내린 결론!!

 

내가 생성한 파일 자체가 UTF-8이 아닌 다른 것으로 인코딩 되어있다!!!

 

그래서 리눅스에서 인코딩 설정을 어떻게 하는지가 중요하게 되었는데, 답은 의외로 간단했다.



  1. 일단은 위 그림과 같이 putty 설정을 보면 <창 – 변환>에서 수신한 데이터를 이 문자셋으로 가정 부분에 UTF-8로 해준다.

    이렇게 하고 나면 putty에서 UTF-8로 디코딩하는 것 같아보였다. 그래서 기존에 작성했던 파일의 한글 부분을 보면 아래 그림과 같이 이상한 문자로 장식된다.
    바로 아래 그림의 흰 사각형 안쪽 부분에 있는 글들이 원래는 한글로 된 글자였는데, 지금은 저렇게 알아볼 수 없게 표시되는 것이다.


    이 파일을 실제로 웹 브라우저를 통해서 보면 아래와 같은 참혹한 결과를 볼 수 있을 것이다.



    그래서 우리가 해야할 일은,,

     

     

  2. 기존의 한글 부분을 다시 채워넣는 것이다.

    이렇게 깨진 부분을 다시 제대로 된 한글도 채워 넣으면 이제는 UTF-8형식을 따르게 되는 것이다.


    이렇게 바꾸고 나서 저장을 하고 다시 웹 브라우저를 통해서 보면 다음 그림과 같이 아주 멋지게 한글이 잘 나옴을 알 수 있다.


    Mission Success!!
신고
Posted by Code-Moon

댓글을 달아 주세요

  1. BlogIcon pooha302 2010.03.11 17:14 신고 Address Modify/Delete Reply

    shell 작업은 왠만하면 putty는 비추..
    http://netsarang.co.kr
    XShell 추천 ㅋㅋ

  2. BlogIcon 이선호 2013.03.29 13:20 신고 Address Modify/Delete Reply

    무지무지 감사해요!

티스토리 툴바