-
[SQLite] 외래키 (Foreign Key)Software/SQLite 2017. 10. 15. 23:41반응형
들어가기 전
외래키 : 테이블의 한 필드가 다른 테이블의 기본키 필드를 참조 할 때 이를 외래키 (Foreign Key)라고 한다.
외래키를 통해 우리는 두 테이블을 연결하고 관계성을 가지게 할 수 있다. 외래키라는 테이블 간의 연결 고리는 여러 테이블에 정보를 저장하고 관리하게 할 수 있도록 함으로써 중복된 데이터를 없애고 확장성을 가지게 해준다.
종속 테이블 : 외래키를 포함하고 있는 테이블
상위 테이블 : 종속 테이블에서 참조하는 기본키를 가지고 있는 테이블
외래키는 상위 테이블의 기본키 컬럼과 이름이 달라도 무관
외래키 설정
- 외래키 설정은 테이블 생성 시 가능하며 기본적인 구문은 다음과 같다.
- CONSTRAINT [제약조건 키 이름] : 외래키 제약조건의 이름 설정 (생략 가능)
- FOREIGN KEY ([컬럼 이름]) : 외래키로 지정할 [컬럼 이름] 명시 (생략 불가능)
- REFERENCES [상위 테이블] ([참조할 컬럼 이름]) : 참조할 상위 테이블과 컬럼 이름 명시 (생략 불가능)
- 아래는 carBrand 테이블의 기본키인 brand_id를 외래키로 참조하는 cars 테이블 생성하는 구문이다.
sqlite> CREATE TABLE cars(
...> car_id INTEGER PRIMARY KEY AUTOINCREMENT,
...> brand_id INTEGER,
...> name TEXT,
...> price INTEGER,
...> CONSTRAINT brandId_fk FOREIGN KEY(brand_id)
...> REFERENCES carBrand(brand_id));
- 만약 외래키가 활성화 되어 있지 않다면 "PRAGMA foreing_keys=1; " 를 통해 외래키를 활성화 해주자.
sqlite> PRAGMA foreign_keys;
foreign_keys
------------
0
sqlite> PRAGMA foreign_keys = 1; (0: 비활성화, 1: 활성화)
- 이제 값을 한번 넣어 보자.
sqlite> select * from carBrand;
brand_id brandName
---------- ----------
1 Hyundai
2 Kia
10 BMW
11 Benz
12 Audi
sqlite> INSERT INTO cars (car_id, name, price, brand_id)
...> VALUES(1, 'Sonata', 1500000, 1);
sqlite> INSERT INTO cars (name, price, brand_id)
...> VALUES('K5', 1500000, 100);
Error: FOREIGN KEY constraint failed
- 위를 보면 처음 값은 정상적으로 입력되었지만 두 번째 레코드는 정상적으로 입력되지 않은 것을 알 수 있다. 그 이유는 종속 테이블(cars)의 외래키가 상위 테이블(carBrand)의 기본키(brand_id) 값들 중 하나로 입력 되지 않았기 때문이다. 바로 참조 무결성(Referential integrity) 제약 조건을 지키지 못한 것이다. 이처럼 외래키가 설정된 경우에는 참조 무결성을 위반하는 입력/수정이 되지 않도록 주의해야 한다.
반응형'Software > SQLite' 카테고리의 다른 글
[SQLite] 내부 조인(Inner Join) (0) 2018.01.13 [SQLite] 중첩 질의 (Nested query) (0) 2017.11.27 [SQLite] 기본키 (Primary Key) (0) 2017.09.16 [SQLite] 관계형 데이터베이스 (0) 2017.09.02 [SQLite] 그룹화 (1) 2017.08.21 댓글