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 Q&A 9284 게시물 읽기
No. 9284
불완전한 테이블 제약조건에 대해서
작성자
souler(souler)
작성일
2013-05-27 17:59ⓒ
2013-05-30 02:57ⓜ
조회수
9,117

안녕하세요. 제약조건과 관련해서 질문 남깁니다.

A와 B의 테이블에서 불완전한 제약조건을 설정하려면 어떻게 해야하나요?

 

A 테이블

아이디 이름
1 홍길동
2 이순신
3 김유신

 

B 테이블

아이디 이름 점수
0 NULL 10
0 NULL 10
1 홍길동 100
1 홍길동 90
2 이순신 80
2 이순신 80
3 김유신 85

 

위와 같이 테이블이 있을때 양 테이블간 업데이트/삭제 시 케스케이드 처리되게

하려면 어떻게 제약조건을 주어야 할까요?

 

 

1. 아이디를 기준으로 제약조건 처리를 해야 함.

2. 예를 들어 A 테이블에서 아이디가 1->4로 변경 될 경우 B 테이블도 1->4로 갱신되어야 함.

3. 단, B 테이블에서의 아이디 값은 A 테이블에 존재하지 않을 수도 있음.

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

 PostgreSQL에서는 저 불완전한 제약조건을 만들수가 없습니다. 

저런 경우에도 참조키를 만들수 있는 것을 불완전한 제약조건이라고 하는 것을 오늘 처음 알았네요. 

 

참조키를 만드려면, 그 키를 구성하는 칼럼들 가운데 적어도 하나는 완벽하게 

참조테이블에 모두 있어야합니다. 

즉, 윗 경우라면, 반드시 B테이블의 아이디 칼럼에 대한 값들이 모두 A 테이블에 있어야 참조키를 만들 수 있습니다. 

 

김상기(ioseph)님이 2013-05-27 21:09에 작성한 댓글입니다.

제가 잘몰랐네요.

그렇다면 제약조건이 아니더라도 위와 같은 방식의 처리를 하려면 어떻게 해야할까요?

souler(souler)님이 2013-05-27 22:50에 작성한 댓글입니다.

특색있는 제약조건이군요...

 

그렇다면 어차피 B 는 A 에 대해 자료에 대해 별로 의존성이 없어 보이니깐

 

그냥 A 에다가 트리거를 걸면 될 거 같습니다.

 

A 가 갱신될때 B 를 갱신시켜주면 되겠지요.

 

tyro님이 2013-05-28 14:34에 작성한 댓글입니다. Edit

-- 특색있는 제약조건이군요...

-- 그렇다면 어차피 B 는 A 에 대해 자료에 대해 별로 의존성이 없어 보이니깐

-- 그냥 A 에다가 트리거를 걸면 될 거 같습니다.

-- A 가 갱신될때 B 를 갱신시켜주면 되겠지요.

 

그럼 B 가 갱신될 때는 역시 트리거로 A 를  갱신시켜주나요?

그럼 양쪽 트리거에 의해서  자칫 무한루프가 발생할 수 있습니다.

따라서 상당히 까다로운 문제가 도사리고 있습니다.

 

초보대왕님이 2013-05-29 07:01에 작성한 댓글입니다. Edit

초보대왕//

 

으잉? 일반적인 A(pk), B(fk->A) 가 외래키 관계에 있을때

B 를 갱신하면 A 가 갱신되나요?? 조금 의아하네요...(제가 뭔가 잘못 알고 있는 것일까요..?)

 

B를 갱신할때 A에 있으면 그냥 B만 갱신될테고

A 에 없으면 에러나는게 아니던가요??

 

만일 그렇게 동작한다면

그럼 기존에 B 에서 A 를 참조하고 있던 값들은 어찌 되나요? 그냥 미아가 되나요?

(질문에서는 없는 값들도 있다고 했으니깐)

아니면 B 값이 갱신되니깐 A 가 따라 갱신되고 그러면 그 값을 참조하던 B 의 값들도 또 갱신하고 그런가요??

 

 

tyro님이 2013-05-29 14:16에 작성한 댓글입니다.
이 댓글은 2013-05-29 14:21에 마지막으로 수정되었습니다. Edit

MYSQL에서는 아래와 같이 처리하면 된다고 하네요.

 

CREATE TABLE `테이블A` (
`uid` INT(10) NOT NULL COMMENT '아이디',
`nm` VARCHAR(50) NULL DEFAULT NULL COMMENT '이름',
PRIMARY KEY (`uid`)
)
COLLATE='euckr_korean_ci'
ENGINE=InnoDB;

 

CREATE TABLE `테이블B` (
`uid` INT(10) NULL DEFAULT NULL,
`amt` INT(10) NULL DEFAULT NULL,
INDEX `FK_aa2_aa1` (`uid`),
CONSTRAINT `FK_aa2_aa1` FOREIGN KEY (`uid`) REFERENCES `테이블A` (`uid`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='euckr_korean_ci'
ENGINE=InnoDB;
 

souler(souler)님이 2013-05-29 17:54에 작성한 댓글입니다.
이 댓글은 2013-05-29 17:55에 마지막으로 수정되었습니다.

souler//

그건 pgsql 에서도 다 됩니다. 똑같은 방식으로 cascade 걸면 됩니다.

문제는 원글에서 3번 조항입니다.

이 3번 조항은 참조 무결성 문제를 파기하는 조건입니다.

그 3번 조항으로 인해서 FK 가 아니라 그냥 조인조건으로만 사용할 수 밖에 없습니다.

 

tyro님이 2013-05-29 22:35에 작성한 댓글입니다. Edit

만약 B 테이블이 아래와 같은 경우라면 제약처리가 가능할까요?

 

아이디 이름 점수
0 김유신 10
0 김유신 10
1 홍길동 100
1 홍길동 90
2 이순신 80
2 이순신 80
3 김유신 85

 

위와 같이 A테이블에서 아이디는 참조할 수 없지만, 이름 값으로 참조가 가능하다면,

외래키를 통한 0을 제외한 1~3의 아이디 값의 케스케이드 처리가 가능할지.. 답변감사합니다!

souler(souler)님이 2013-05-30 02:57에 작성한 댓글입니다.
이 댓글은 2013-05-30 02:59에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
9288index컬럼 type casting [1]
김민석
2013-06-04
8820
9286bytea를 PQescapeByteaConn함수 사용한 예제 없나요? [1]
심상호
2013-05-31
10456
9285완전초보의 pg_connect 질문 [2]
정성모
2013-05-29
8988
9284불완전한 테이블 제약조건에 대해서 [8]
souler
2013-05-27
9117
9283vacuum실행 후 속도저하 [2]
왕초보
2013-05-27
9312
9282pl/pgsql 관한 질문입니다. [1]
김문수
2013-05-23
8939
9281데이터베이스 수업을 듣는 학생입니다. 에러구문때문에 질문드립니다. [2]
김영백
2013-05-22
9413
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다