여러 개의 칼럼을 기본키로 설정하는 경우
CREATE TABLE animal
(
name varchar(16) NOT NULL,
type varchar(16) NOT NULL,
age int,
PRIMARY KEY (name, type)
);
ALTER TABLE person
DROP PRIMARY KEY;
ALTER TABLE person
ADD PRIMARY KEY (pid);
ALTER TABLE animal
ADD CONSTRAINT PK_animal PRIMARY KEY (name, type);
한 테이블을 다른 테이블과 연결해주는 역할이며,
참조되는 테이블의 항목은 그 테이블의 기본키 (혹은 단일값)
CREATE TABLE 에서 FOREIGN KEY를 지정하는 경우
CREATE TABLE orders
(
oid int not null,
order_no varchar(16),
pid int,
PRIMARY KEY (oid),
CONSTRAINT FK_person FOREIGN KEY (pid) REFERENCES person(pid)
);
CREATE TABLE 에서 FOREIGN KEY를 지정하는 경우, CONSTRAINT 를 생략할 수 있다.
CREATE TABLE job
(
jid int not null,
name varchar(16),
pid int,
PRIMARY KEY (jid);
FOREIGN KEY (pid) REFERENCES person(pid)
);
자동 생성된 CONSTRAINT 를 확인하는 방법
SHOW CREATE TABLE job;
ALTER TABLE tablename
DROP FOREIGN KEY FK_constraint;
ALTER TABLE orders
DROP FOREIGN KEY FK_person;
기존 테이블에서 외래 키를 생성한다.
ALTER TABLE tablename
ADD FOREIGN KEY (column) REFERENCES REF_tablename(REF_column);
ALTER TABLE orders
ADD FOREIGN KEY (pid) REFERENCES person(pid);
💡 경찰서 이름이 각 테이블에서 표시되는 형식이 다르다!
-> police_station의 name을 참조해 crime_status의 reference 컬럼(ex. 서울중부경찰서 형태)을 만들고 -> police_station의 name과 동일한 값을 찾는다. -> 지역별 경찰서 주소 찾기가 가능하다.
ALTER TABLE police_station
ADD PRIMARY KEY (name);
ALTER TABLE crime_status
ADD COLUMN reference VARCHAR(16);
Foreign Key 생성
ALTER TABLE crime_status
ADD FOREIGN KEY (reference) REFERENCES police_station(name);
Foreign Key 값 Update
UPDATE crime_satus c, police_station p
SET c.reference = p.name
WHERE p.name LIKE concat('서울', c.police_station, '경찰서');
SELECT distinct police_station, reference
FROM crime_status;
Foreign Key 를 기준으로 두 테이블을 연관시켜 검색할 수 있다.
SELECT c.police_station, p.address
FROM crime_status c, police_station p
WHERE c.reference = p.name
GROUP BY c.police_station;