출처| https://www.youtube.com/watch?v=UVY0mfa4VP0&list=PLqTUMsvO70nk8WfCyU-IPmc85390CaSqM&index=1
https://cafe.naver.com/thisisMySQL
https://velog.io/@ong_hh/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B5%AC%EC%B6%95
[데이터의 무결성 제약]
USE tabledb;
drop table if exists buytbl, usertbl;
create table usertbl
( userid char(10) primary key,
name varchar(10) not null,
birthday int not null
);
테이블의 정보를 보기 위해서는 DESCRIBE
를 사용하면 된다.
추가적으로 PRIMARY KEY를 사용하면서 키의 이름까지 사용할 수 있다.
예를들어, PK_userTBL_userID와 같은 이름을 붙여 주면 이름만으로도 PK가 userTBL 테이블의 userID 열에 지정됨을 읽을 수 있다.
create table usrtbl
( userid char(8) not null,
name varchar(10) not null,
birthyear int not null,
constraint primary key PK_userTBL_userID (userid)
);
create table usertbl
( userid char(8) not null,
name varchar(10) not null,
birthyear int not null
);
alter table usertbl
add constraint pk_usertbl_userid
primary key (userid);
add constraint pk_usertbl_userid : 제약 조건을 추가하자. 제약 조건 이름은 PK_usertbl_userID이다.
primary key (userid): 추가할 제약 조건은 기본 키 제약 조건이다. 그리고 제약 조건을 설정할 열은 userID이다.
해당 표를 보면 한 열씩 확인을 했을 때, pk의 조건에 맞지 않는다.
그렇기 때문에 제품코드 + 제품 일련 번호를 합쳐 하나의 PK로 볼 수 있다.
CREATE TABLE prodTbl
( prodCode char(3) not null,
prodID char(4) not null,
prodDate datetime not null,
prodCur char(10) null
);
alter table prodtbl add constraint PK_proCode_prodID primary key (prodCode, prodID);
CREATE TABLE prodTbl
( prodCode char(3) not null,
prodID char(4) not null,
prodDate datetime not null,
prodCur char(10) null,
constraint pk_protbl_procode_prodid primary key(prodCode,prodID)
);
외래 키 관계를 설정하면 하나의 테이블이 다른 테이블에 의존하게 된다.
외래 키를 정의하는 테이블인 buytbl
을 외래 키 테이블
이라고 부르고, 외래 키에 의해서 참조가 되는 테이블인 usertbl
을 그냥 기준 테이블
이라고 한다.
외래 키 테이블이 참조하는 기준 테이블의 열은 반드시 primary key
이거나 unique
제약 조건이 설정 되어 있어야 한다.
create table buytbl
(
num int auto_increment not null primary key,
userid char(8) not null,
prodName char(6) not null,
foreign key(userid) references usertbl(userid)
);
create table buytbl
(
num int auto_increment not null primary key,
userid char(8) not null,
prodName char(6) not null,
constraint FK_usertbl_buytbl foreign key (userid) references usertbl(userid)
);
create table buytbl
(
num int auto_increment not null primary key,
userid char(8) not null,
prodName char(6) not null
);
alter table buytbl add constraint FK_usertbl_buytbl foreign key (userid) references usertbl(userid);
alter table buytbl drop foreign key fk_usertbl_buytbl;
alter table buytbl add constraint fk_usertbl_buytbl foreign key (userid) references usertbl(userid) on update cascade;
별도로 지정하지 않으면
on update no action
on delete no action
UNIQUE 제약조건 역시 데이터베이스 객체이므로, 컬럼 정의 부분에 UNIQUE를 명시하거나 별도로 CONSTRAINTS 키워드를 사용해 정의할 수 있다.
UNIQUE와 NOT NULL을 같이 명시하면 해당 컬럼에 들어오는 값은 유일함은 물론 반드시 입력해야 한다. 또한 NULL 허용 컬럼에도 UNIQUE 제약조건을 붙일 수 있다.
SQL 제약조건 중 CHECK는 특정 컬럼의 입력 가능한 값의 범위를 지정할 때 사용한다.
만약 어느 한 컬럼에 CHECK 제약조건을 설정한다면, 그 컬럼은 특정한 범위 안에서의 값만 허용한다.
만약 어느 한 테이블에 CHECK 제약조건을 설정한다면, 그 레코드의 다른 컬럼을 기반으로 특정 컬럼의 값을 제한할 수도 있다.
Age라는 컬럼에 18세 이상만 데이터를 넣을 수 있도록 하는 CHECK 제약조건을 가진 Customer라는 테이블을 만들어 보자.
CREATE TABLE Customer (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
CHECK (Age>=18)
);
DEFAULT 제약 조건은 해당 필드의 기본값을 설정할 수 있게 한다.
만약 레코드를 입력할 때 해당 필드 값을 전달하지 않으면, 자동으로 설정된 기본값을 저장한다.
제약조건은 여러 종류가 있는데, 가장 기본적으로 CREATE TABLE에서 쓰이는 NOT NULL에 대해서 알아보자.
NOT NULL 조건의 디폴트 값은 NULL이다. 그래서 테이블을 만들 때 별로로 NOT NULL을 넣어주지 않으면, 자동으로 기본값인 NULL이 제약조건으로 설정된다.
NOT NULL은 NULL값을 허용하지 않겠다!! 쉽게 말해서 빈칸으로 두지 말고 반드시 데이터 값이 입력되어야만 한다!!
이런 규칙이다. 따라서 반드시 특정 데이터 값이 존재해야만 새로운 레코드를 넣거나 수정할 때 오류가 발생하지 않는다.
그럼 이제 예문을 통해서 확인해 보도록 하자. 필자는 memberID, name, phone이라는 이름의 컬럼을 가진 members 테이블을 만드는데, memberID와 name은 반드시 값이 들어가도록 설정하겠다.
> CREATE TABLE members (
-> memberID int NOT NULL,
-> name varchar(20) NOT NULL,
-> phone varchar(20)
-> );
> desc members;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| memberID | int(11) | NO | | NULL | |
| name | varchar(20) | NO | | NULL | |
| phone | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+