테이블에 존재하는 많은행의 데이터를 구분할 수 있는 식별자를 기본키(PRIMARY KEY) 라고 한다.
기본키에 값은 중복되지 않으며 NULL 일 수 없다.
하나의 열에만 기본키를 설정 할 수 있고, 두 개의 열을 합쳐서 기본키를 설정 할 수도 있다.
대부분의 테이블은 기본키를 갖는 열을 가져야 한다.
CREATE TABLE sometable(
num INT NOT NULL PRIMARY KEY,
price INT NOT NULL,
amount SMALLINT NOT NULL,
...
);
기본키를 지정할 열에 PRIMARY KEY 예약어를 넣어주면 된다.
모든 제약 조건은 이름을 가지는데 위 처럼 지정해 주지 않을 경우 MYSQL이 알아서 지정한다.
직접 이름을 지정하려면 다음과 같은 구문을 사용하자.
CREATE TABLE sometable(
num INT NOT NULL,
price INT NOT NULL,
amount SMALLINT NOT NULL,
CONSTRAINT PRIMARY KEY pk_sometable_num (num)
);
위 구문에서 CONSTRAINT 는 생략이 가능하다.
ALTER 구문을 사용해서 테이블을 수정 할 때 제약조건을 추가 할 수 있다.
ALTER TABLE anyTable
ADD CONSTRAINT PK_anyTable_userID
PRIMARY KEY (userID);
2개 의 열을 합쳐서 기본키로 설정 할 수 있다.
CREATE TABLE sometable(
num INT NOT NULL,
price INT NOT NULL,
amount SMALLINT NOT NULL,
CONSTRAINT pk_sometable_num_price
PRIMARY KEY (num, price)
);
외래키 제약조건은 두 테이블 사이의 관계를 선언함으로써 데이터의 무결성을 보장해 주는 역할을 한다. 외래키 관계를 설정하면 하나의 테이블이 다른 테이블에 의존하게 된다.
외래 키 테이블이 참조하는 테이블의 열은 반드시 primary key 이거나 unique 제약조건이 설정되어 있어야한다.
CREATE TABLE tableA(
userID CHAR(8) NOT NULL PRIMARY KEY,
name VARCHAR(10) NOT NULL,
birthYear INT NOT NULL
);
CREATE TABLE tableB(
num INT NOT NULL PRIMARY KEY,
userID CHAR(8) NOT NULL,
prodName CHAR(6) NOT NULL,
FOREIGN KEY(userID) REFERENCES tableA(userID)
);
tableB 의 userID 열은 tableA의 userID열을 참조하도록 FOREIGN KEY로 설정한 것이다.
참조하는 테이블의 열인 userID 는 PRIMARY KEY 제약조건이 설정되어있다.
기본키를 설정할 때 와 마찬가지로 제약조건의 이름을 설정 하기 위해서 다음을 추가 해 주면 된다.
CREATE TABLE tableB(
num INT NOT NULL PRIMARY KEY,
userID CHAR(8) NOT NULL,
prodName CHAR(6) NOT NULL,
CONSTRAINT FK_tableB_userID
FOREIGN KEY(userID) REFERENCES tableA(userID)
);
ALTER TABLE 구문을 이용하는 방법.
ALTER TABLE tableB
ADD CONSTRAINT FK_tableA_tableB
FOREIGN KEY(userID) REFERENCES tableA(userID)
외래키 옵션 중 ON DELETE CASCADE 또는 ON UPDATE CASCADE 가 있는데 이는 참조가 되는 테이블의 데이터가 변경되었을 때 참조하는 테이블도 자동으로 적용되도록 설정 하는 것이다.
예로 tableA 의 userID가 aad2212 였는데 zol9803 으로 바꾸면 tableB 의 userID 도 zol9803으로 자동으로 바뀐다는 뜻이다.
ALTER TABLE tableB
ADD CONSTRAINT FK_tableA_tableB
FOREIGN KEY(userID) REFERENCES tableA(userID)
ON UPDATE CASCADE
아무것도 지정하지 않을 경우 ON UPDATE CASCADE 와 ON DELETE CASCADE를 지정한 것과 같은 상태이다.
UNIQUE 제약조건은 '중복되지 않는 유일한 값' 을 입력해야 하는 조건이다. PRIMARY KEY 제약조건과 비슷하지만 차이점은 NULL값을 허용한다
CREATE TABLE member(
userID CHAR(8) NOT NULL PRIMARY,
name VARCHAR(10) NOT NULL,
email CHAR(30) null,
CONSTRAINT AK_email UNIQUE (email)
);
CHECK 제약조건은 입력되는 데이터를 점검하는 기능이다. 키(height) 값에 마이너스값이 들어올 수 없게 한다든지, 출생년도가 1900년 이후여야 한다든지, 등등 조건을 지정한다.
CREATE TABLE member(
userID CHAR(8) NOT NULL PRIMARY,
name VARCHAR(10),
birthYear INT CHECK (birthYear >= 1900 AND birthYear <= 2023),
CONSTRAINT CK_name CHECK (name IS NOT NULL)
);
첫번째 CHECK 제약조건은 출생년도의 제한을 둠.
두번째 CHECK 제약조건은 CONSTRAINT 를 통해 이름을 지정하며 제약조건을 추가.
DEFAULT 는 값을 입력하지 않을 경우 자동으로 입력되는 기본 값이다.
CREATE TABLE member(
userID CHAR(8) NOT NULL PRIMARY,
name VARCHAR(10) NOT NULL,
email CHAR(30) null,
birthYear INT NOT NULL DEFAULT -1,
height SMALLINT NULL DEFAULT 170
);
ALTER 을 통해 지정하기
ALTER TABLE member
ALTER COLUMN birthYear SET DEFAULT -1;
값을 입력할 때
INSERT INTO member VALUES('LLS', '김강석', 'xxx11@a.a',default, default)
-> default 는 DEFAULT 로 설정된 값을 자동 입력.
INTSERT INTO member(userID, name, email) VALUES('LLS', '김강석', 'xxx11@a.a')
-> 열이름이 명시되지 않으면 DEFAULT로 설정된 값 입력.