에몽이

참조키 본문

DB

참조키

ian_hodge 2016. 10. 17. 14:10

MySQL 외래키 생성 (기본)
ON DELETE RESTRICT, ON UPDATE RESTIRCT
  • 외래키 옵션을 주지 않으면 기본적으로 변경 제약, 삭제 제약이 걸린다.
자식테이블이 참조하는 값에 대해서는 삭제 및 변경이 금지된다.

DB 스키마 간단히[편집]

한국어
직원 { 직원번호, 부서번호, 직원명 }
부서 { 부서번호, 부서명 }
영어 약자
emp { emp_no, dept_no, emp_name }
dept { dept_no, dept_name }

DB 스키마 구체화[편집]

emp
컬럼명자료형
emp_no(PK)양수(11)
dept_no(FK)양수(11)
emp_name문자(32)
dept
컬럼명자료형
dept_no(PK)양수(11)
dept_name문자(32)

테이블 생성[편집]

부서 테이블 생성
CREATE TABLE `dept` (
  `dept_no` int(11) unsigned NOT NULL,
  `dept_name` varchar(32) NOT NULL,
  PRIMARY KEY (`dept_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
직원 테이블 생성
CREATE TABLE `emp` (
  `emp_no` int(11) unsigned NOT NULL,
  `dept_no` int(11) unsigned NOT NULL,
  `emp_name` varchar(32) NOT NULL,
  PRIMARY KEY  (`emp_no`),
  FOREIGN KEY (`dept_no`) REFERENCES `dept` (`dept_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 외래키에 옵션을 주지 않았다. 그러면 기본적으로 삭제와 변경이 제한된다.

샘플 데이터[편집]

부서 테이블
1
2
3
dept_nodept_name
1001인사부
1002영업부
1003생산부
직원 테이블
1
2
3
emp_nodept_noemp_name
20120011001한놈
20120021003두시기
20120031003석삼
→ 한놈은 부서번호가 1001이므로 '인사부'
→ 두시기, 석삼은 부서번호가 1003이므로 '생산부'

데이터 입력[편집]

INSERT INTO dept (dept_no, dept_name) VALUES ('1001', '인사부');
INSERT INTO dept (dept_no, dept_name) VALUES ('1002', '영업부');
INSERT INTO dept (dept_no, dept_name) VALUES ('1003', '생산부');

INSERT INTO emp (emp_no, dept_no, emp_name) VALUES ('2012001', '1001', '한놈');
INSERT INTO emp (emp_no, dept_no, emp_name) VALUES ('2012002', '1003', '두시기');
INSERT INTO emp (emp_no, dept_no, emp_name) VALUES ('2012003', '1003', '석삼');

데이터 변경/삭제[편집]

-- 갱신
UPDATE dept SET dept_no='1004' WHERE dept_no='1003';
-- 삭제
DELETE FROM dept WHERE dept_no='1003';

'생산부'의 부서번호 1003을 변경하거나 삭제하려고 하면 다음과 같은 오류가 발생한다.

#1451 - Cannot delete or update a parent row:
a foreign key constraint fails (`test`.`emp`, CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`dept_no`) REFERENCES `dept` (`dept_no`))

직원테이블에서 참조하지 않는 1002는 당연히 삭제 가능하다.

DELETE FROM dept WHERE dept_no='1002'
-- 1 row deleted. ( Query took 0.0018 sec )

출처: http://zetawiki.com/wiki/MySQL_%EC%99%B8%EB%9E%98%ED%82%A4_%EC%83%9D%EC%84%B1


'DB' 카테고리의 다른 글

redis expire 사용법  (0) 2017.09.14
postgresql 외부 접속하기  (0) 2017.05.08
mysql 컬럼 추가/삭제  (0) 2017.01.11
ex  (0) 2016.10.17
select 구문  (0) 2016.10.17
Comments