database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Tutorials 4961 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 4961
자습서 - 3. 고급 기능 - 3.3 Foreign Key
작성자
김상기(ioseph)
작성일
2003-09-18 23:46ⓒ
2004-12-10 03:21ⓜ
조회수
6,479

3.3. Foreign Keys

(주, 흔히 외래키라고 옮기기는 하는데, 외래열쇠라고 하는 것도 웃기고, 그냥 영문 그대로 쓰기로 했습니다)

 

2장에서 사용한 weather, cities 테이블의 관계를 다시 한 번 살펴봅시다. 이 두 테이블 간에 아무른 관계 조건이 없다고 가정한다면, 다음과 같은 문제점들이 발생할 것입니다. 두 테이블을 도시명으로 조인해서 자료를 찾고자 하는데, inner join 일 경우는 사용자가 한 테이블에서 도시명을 잘못 입력했다면, 그 자료는 완벽하게 찾을 수 없는 사태가 발생하겠지요. 또 한 테이블에서 도시명을 바꾸었을 경우도 그렇게 될 것이고, 또 cities 테이블에서 특정 도시 정보가 삭제가 되어버리면 weather 테이블 안에 있는 그 도시의 날씨 정보가 전혀 쓸 모 없게 되어버립니다. 그래서, weather 테이블에 자료를 입력할 때는 반드시 cities 테이블에 있는 도시명을 사용해야지만 입력할 수 있도록 해야겠다고 테이블 관계를 다시 정의합니다. 이것을 RDBMS 용어로 참조 무결성(referential integrity) 이라고 합니다. 이것을 구현하기 위해서 단순하게 생각해서 weather 테이블에 자료를 입력하기 전에, 먼저 입력될 도시명이 cities 테이블에 있는지 살펴보고 있다면 입력작업을 계속 진행하고, 없다면 입력작업은 중지하도록 프로그램 만들 수 있겠지요. 처음에 아무런 참조 무결성 조건이 없는 상태보다는 좀 더 안전해졌지만, 아직도 많은 문제점들을 안고 있습니다 (앞에서 이야기한 update, delete 관련 작업에서). 이런 문제를 PostgreSQL에서는 다음과 같이 간단히 Foreign Key를 지정함으로 해결할 수 있습니다:

CREATE TABLE cities (
  city     varchar(80) primary key,
  location point
);

CREATE TABLE weather (
 city      varchar(80) references cities,
 temp_lo   int,
 temp_hi   int,
 prcp      real,
 date      date
);

두 테이블을 다시 만들고 다음과 같이 입력하면:

INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28');

ERROR:  <unnamed> referential integrity violation 
        - key referenced from weather not found in cities

이렇게 오류를 내면서 입력작업이 중지됩니다. <unnamed> 제약조건이 참조 무결성 조건에 위배 되었다 - weather 에서 지정한 key들 cities 에서 못 찾았다. 이런 뜻입니다.

 

foreign key 기능은 응용 프로그램에서 해야할 일들을 대폭 줄여줌과 동시에 자료의 관계성을 보다 견고하게 만들어줍니다. foreign key 기능은 여기서 언급한 것보다 훨씬 많은 것을 제공하고 있습니다. 이 자습서에서 그 세세한 기능들에 대해서는 언급하지 않겠습니다. 자세한 사항은 사용자 안내서를 참조하십시오.

 

(주, foreign key의 사용의 시스템의 속도를 저하시키고, 유지 보수가 어렵기 때문에 가능한 한 사용하지 않는 것이 좋다고 혹자들은 이야기 합니다. 하지만, 그 반대로 잘 만들어진 foreign key는 확실히 응용프로그램의 코딩량을 줄여주며, 자료를 안전하게 관리할 수 있도록 합니다. - 아주 중요한 이야기임, 시험에 나옴)

 

그래서, 이 부분에 대해서 꼭 사용자 안내서를 읽어가면서 꼼꼼히 공부해 둡시다.

이 글에 대한 댓글이 총 1건 있습니다.

오타가 있어서 정정합니다..


weather table 생성 시 Foreign Key 구문이 잘못되었네요..


CREATE TABLE weather (

        city      varchar(80) references cities(city),

        temp_lo   int,

        temp_hi   int,

        prcp      real,

        date      date

);


해당 테이블의 컬럼을 지정해야 합니다..


ps : PostgreSQL 공부를 위해 찾아왔다가 잘보고 있습니다..

혹시 Ubuntu에서는 토튜리얼이 어디에 있는지 못찾겠네요..

알고 계시면 답변 부탁드리겠습니다..

찾지 못해서 pgAdmin3의 도움말로 보고 있긴합니다만.. ㅋ

버전이 조금 낮네요.. 8.1.4 도움말이군요..

이호경(nifelee)님이 2008-02-16 22:53에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4969자습서 - 3. 고급 기능 - 3.6 끝맺음 [2]
김상기
2003-09-23
6456
4968자습서 - 3. 고급 기능 - 3.5 상속
김상기
2003-09-23
6789
4967자습서 - 3. 고급 기능 - 3.4 트랜잭션
김상기
2003-09-23
7106
4961자습서 - 3. 고급 기능 - 3.3 Foreign Key [1]
김상기
2003-09-18
6479
4959자습서 - 3. 고급 기능 - 3.2 뷰(view)
김상기
2003-09-18
6274
4958자습서 - 3. 고급 기능 - 3.1 소개
김상기
2003-09-18
5886
4956자습서 - 2. SQL 언어 - 2.9 자료 삭제
김상기
2003-09-17
5388
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.053초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다