CREATE TABLE tablename
(
column1 datatype NOT NULL,
column2 datatype NOT NULL,
...
CONSTRAINT constraint_name
PRIMARY KEY (column1, column2, ...)
);
예) 하나의 컬럼을 기본키로 설정하는 경우
CREATE TABLE peroson
(
pid int NOT NULL,
name varchar(16),
age int,
sex char,
PRIMARY KEY (pid)
);
예) 여러개의 컬럼을 기본키로 설정하는 경우
CREATE TABLE animal
(
name varchar NOT NULL,
type varchar NOT NULL,
age int,
PRIMARY KEY (name, type)
);
= 두개가 하나의 pri라는 뜻
ALTER TABLE tablename
DROP PRIMARY KEY;
테이블당 하나만 있기 때문에 별도로 이름 안 줘도 삭제됨
ALTER TABLE person
DROP PRIMARY KEY;
ALTER TABLE animal
DROP PRIMARY KEY;
ALTER TABLE tablename
ADD PRIMARY KEY(column1, column2, ...);
ALTER TABLE person
ADD PRIMARY KEY(pid);
ALTER TABLE animal
ADD CONSTRAINT PK_animal PRIMARY KEY(name, type);
# CONSTRAINT PK_animal 생략가능 - > 생략하게 되면 자동생성됨
CREATE TABLE tablename
(
column1 datatype NOT NULL,
column2 datatype NOT NULL,
column3 datatype,
column4 datatype,
...
CONSTRAINT constraint_name
PRIMARY KEY (column1, column2, ...)
CONSTRAINT constraint_name
PRIMARY KEY (column3, column4, ...) REFERENCES REF_tablename(REF_column)
);
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 job
(
jid int NOT NULL,
namevarchar(16),
pid int,
PRIMARY KEY (jid),
FOREIGN KEY(pid) REFERENCES person(pid)
);
SHOW CREATE TABLE tablename;
primary key와는 달리, foreign key는 여러개 있을 수 있다.
= 한 테이블이 참조하는 테이블이 여러개일 수 있다.
생략하면 이름이 자동생성되는데, 이름을 알아야 drop등을 할 수 있어서 이름을 알아보기 위한 코드
ALTER TABLE tablename
DROP FOREIGN KEY FK_constraint;
여러개라서 이름을 줘야함
ALTER TABLE tablename
DROP FOREIGN KEY FK_person;
-> 레퍼런스 관계는 깨지고 key값만 남아있게 됨
ALTER TABLE tablename
ADD FOREIGN KEY(column) REFERENCES REF_tablename(REF_column);
ALTER TABLE orders
ADD FOREIGN KEY(pid) REFERENCES person(pid);
police_station과 crime_status 테이블 사이의 관계(foreign key)를 설정해봅시다.
AWS RDS(database-1) 의 zerobase에서 작업합니다.
select count(distinct name) from police_station;
select count(police_station) from crime_status;
select distinct name from police_station limit 3;
select distinct police_station from crime_status limit 3;
select c.police_station, p.name
#이름 지정
from crime_status c, police_station p
# 서울+지역만 나타내는 이름+ 경찰서 --> 매칭되는지 볼 것
where p.name like concat('서울', c.police_station, '경찰서')
# 정보가 많아서 중복되지않도록 매칭
group by c.police_station, p.name;
alter table police_station
add primary key(name);
alter table crime_status
add column reference varchar(16);
alter table crime_status
add foreign key(reference)
reference police_station(name);
UPDATE crime_status 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;
select c.police_station, p.address
from crime_status c, police_station p
where c.reference = p.name
group by c.police_station;
create table study
-> (
-> study_id int NOT NULL,
-> study_date date,
-> study_time time,
-> patient_id int,
-> primary key(study_id),
-> constraint FK_study foreign key (patient_id) references person(pid)
-> );
desc study;
show create table study;
alter table study
-> drop primary key;
alter table study
-> drop foreign key FK_study;
alter table study
-> add foreign key(patient_id) references person(pid);
alter table study
-> add primary key (study_id);