본문 바로가기
MySQL

MySQL 제약조건

by FraisGout 2020. 7. 2.

제약 조건(constraint)

제약 조건(constraint)이란 데이터의 무결성을 지키기 위해, 데이터를 입력받을 때 실행되는 검사 규칙을 의미합니다.

 

이러한 제약 조건은 CREATE 문으로 테이블을 생성할 때나 ALTER 문으로 필드를 추가할 때도 설정할 수도 있습니다.

 

 

 

MySQL에서 사용할 수 있는 제약 조건은 다음과 같습니다.

 

 

 

1. NOT NULL

 

2. UNIQUE

 

3. PRIMARY KEY

 

4. FOREIGN KEY

 

5. DEFAULT

 

NOT NULL

NOT NULL 제약 조건을 설정하면, 해당 필드는 NULL 값을 저장할 수 없습니다.

 

, 이 제약 조건이 설정된 필드는 무조건 데이터를 가지고 있어야 합니다.

 

 

 

NOT NULL 제약 조건은 CREATE 문으로 테이블을 생성할 때나, 나중에 ALTER 문으로 추가할 수도 있습니다.

 

CREATE 문으로 NOT NULL 설정

CREATE 문으로 테이블을 생성할 때 해당 필드의 타입 뒤에 NOT NULL을 명시하면, 해당 필드는 NULL 값을 가질 수 없습니다.

 

문법

CREATE TABLE 테이블이름

 

(

 

필드이름 필드타입 NOT NULL,

 

...

 

)

 

 

 

다음 예제는 CREATE TABLE 문을 사용하여 Test 테이블을 생성하면서, ID 필드에 NOT NULL 제약 조건을 설정합니다.

 

이렇게 ID 필드에 NOT NULL 제약 조건을 설정하고 DESCRIBE 문을 사용하여 Test 테이블의 상세 정보를 확인하면, 다음 실행 결과와 같이 나타납니다.

 

예제

CREATE TABLE Test

 

(

 

ID INT NOT NULL,

 

Name VARCHAR(30),

 

ReserveDate DATE,

 

RoomNum INT

 

);

 

그리고서 INSERT INTO 문을 사용하여 새로운 레코드를 하나 추가하고 있습니다.

 

마지막으로 SELECT 문을 사용하여 Test 테이블의 모든 레코드를 선택하여 확인합니다.

 

 

 

위의 예제에서는 이제부터 Test 테이블에 INSERT 문으로 새로운 레코드를 추가할 때 ID 필드의 값으로 NULL을 사용할 수 없습니다.

 

 

 

NOT NULL 제약 조건이란 해당 필드에 NULL 값을 저장할 수 없도록 설정하는 것으로, 해당 필드를 생략하지 못하도록 하는 제약 조건은 아닙니다.

 

따라서 INSERT 문으로 레코드를 저장할 때 NOT NULL 제약 조건이 설정된 필드의 값을 생략할 수도 있습니다.

 

 

 

다음 예제는 ID 필드에 NOT NULL 제약 조건이 설정된 Test 테이블에 ID 필드가 생략된 레코드를 저장하는 예제입니다.

 

예제

 

 

INSERT INTO Test (Name, ReserveDate, RoomNum)

 

VALUES('이순신', '2016-02-16', 1108);

이처럼 NOT NULL 제약 조건이 설정된 필드의 값이 생략된 레코드도 정상적으로 저장되는 것을 확인할 수 있습니다.

 

ALTER 문으로 NOT NULL 설정

ALTER 문으로 테이블에 새로운 필드를 추가하거나 수정할 때도 NOT NULL 제약 조건을 설정할 수 있습니다.

 

 

 

테이블에 새로운 필드를 추가할 때 NOT NULL 제약 조건을 설정하는 문법은 다음과 같습니다.

 

문법

ALTER TABLE 테이블이름

 

ADD 필드이름 필드타입 NOT NULL

 

 

 

기존 필드에 NOT NULL 제약 조건을 설정하는 문법은 다음과 같습니다.

 

문법

ALTER TABLE 테이블이름

 

MODIFY COLUMN 필드이름 필드타입 NOT NULL

 

 

 

다음 예제는 ALTER TABLE 문을 사용하여 Reservation 테이블의 Name 필드에 NOT NULL 제약 조건을 설정합니다.

 

이렇게 Name 필드에 NOT NULL 제약 조건을 설정한 후에 DESCRIBE 문을 사용하여 Reservation 테이블의 상세 정보를 확인하면, 다음 실행 결과와 같이 나타납니다.

 

예제

 

 

ALTER TABLE Reservation

 

MODIFY COLUMN Name VARCHAR(30) NOT NULL;

그리고서 INSERT INTO 문을 사용하여 새로운 레코드를 하나 추가합니다.

 

마지막으로 SELECT 문을 사용하여 Reservation 테이블의 모든 레코드를 선택하여 확인합니다.

 

 

 

위의 예제에서는 이제부터 Reservation 테이블에 레코드를 추가할 때 Name 필드의 값으로 NULL을 사용할 수 없습니다.

 

UNIQUE

UNIQUE 제약 조건을 설정하면, 해당 필드는 서로 다른 값을 가져야 합니다.

 

, 이 제약 조건이 설정된 필드는 중복된 값을 저장할 수 없습니다.

 

 

 

UNIQUE 제약 조건은 CREATE 문으로 테이블을 생성할 때나, 나중에 ALTER 문으로 추가할 수도 있습니다.

 

CREATE 문으로 UNIQUE 설정

CREATE 문에서 테이블을 생성할 때 다음과 같이 UNIQUE 제약 조건을 설정할 수 있습니다.

 

 

 

CREATE 문으로 테이블을 생성할 때 해당 필드의 타입 뒤에 UNIQUE를 명시하면, 해당 필드에는 더는 중복된 값을 저장할 수 없습니다.

 

문법

1. CREATE TABLE 테이블이름

 

(

 

필드명 필드타입 UNIQUE,

 

...

 

)

 

2. CREATE TABLE 테이블이름

 

(

 

필드이름 필드타입,

 

...,

 

[CONSTRAINT 제약조건이름] UNIQUE (필드이름)

 

)

 

 

 

위의 두 문법은 모두 해당 필드에 UNIQUE 제약 조건을 설정합니다.

 

이때 두 번째 문법을 사용하면, 해당 제약 조건에 이름을 설정할 수 있습니다.

 

 

 

다음 예제는 CREATE TABLE 문을 사용하여 Test 테이블을 생성하면서 ID 필드에 UNIQUE 제약조건을 설정하는 예제입니다.

 

이렇게 ID 필드에 UNIQUE 제약조건을 설정한 후에 DESCRIBE 문을 사용하여 Test 테이블의 상세 정보를 확인하면, 다음 실행 결과와 같이 나타납니다.

 

예제

CREATE TABLE Test

 

(

 

ID INT UNIQUE,

 

Name VARCHAR(30),

 

ReserveDate DATE,

 

RoomNum INT

 

);

그리고서 INSERT INTO 문을 사용하여 ID 필드의 값이 1로 같은 2개의 레코드를 추가합니다.

 

마지막으로 SELECT 문을 사용하여 Test 테이블의 모든 레코드를 선택하여 확인합니다.

 

 

 

위의 예제에서는 이제부터 Test 테이블에 새로운 레코드를 저장할 때 ID 필드의 값이 기존에 저장된 ID 값과 중복되는 값을 가지는 레코드는 저장할 수 없습니다.

 

ALTER 문으로 UNIQUE 설정

ALTER 문으로 테이블에 새로운 필드를 추가하거나 수정할 때도 UNIQUE 제약 조건을 설정할 수 있습니다.

 

 

 

테이블에 새로운 필드를 추가할 때 UNIQUE 제약 조건을 설정하는 문법은 다음과 같습니다.

 

문법

1. ALTER TABLE 테이블이름

 

ADD 필드이름 필드타입 UNIQUE

 

2. ALTER TABLE 테이블이름

 

ADD [CONSTRAINT 제약조건이름] UNIQUE (필드이름)

 

 

 

기존 필드에 UNIQUE 제약 조건을 설정하는 문법은 다음과 같습니다.

 

문법

1. ALTER TABLE 테이블이름

 

MODIFY COLUMN 필드이름 필드타입 UNIQUE

 

2. ALTER TABLE 테이블이름

 

MODIFY COLUMN [CONSTRAINT 제약조건이름] UNIQUE (필드이름)

 

 

 

위의 두 문법은 모두 해당 필드에 UNIQUE 제약 조건을 설정합니다.

 

이때 두 번째 문법을 사용하면, 해당 제약 조건에 이름을 설정할 수 있습니다.

 

 

 

다음 예제는 ALTER TABLE 문을 사용하여 Reservation 테이블의 RoomNum 필드에 reservedRoom이라는 이름을 가지는 UNIQUE 제약 조건을 설정합니다.

 

이렇게 RoomNum 필드에 UNIQUE 제약조건을 설정한 후에 DESCRIBE 문을 사용하여 Reservation 테이블의 상세 정보를 확인하면, 다음 실행 결과와 같이 나타납니다.

 

예제

 

 

ALTER TABLE Reservation

 

ADD CONSTRAINT reservedRoom UNIQUE (RoomNum);

 

그리고서 INSERT INTO 문을 사용하여 RoomNum 필드의 값이 818로 같은 2개의 레코드를 추가합니다.

 

마지막으로 SELECT 문을 사용하여 Reservation 테이블의 모든 레코드를 선택하여 확인합니다.

 

 

 

위의 예제에서는 이제부터 Reservation 테이블에 INSERT 문으로 레코드를 저장할 때 RoomNum 필드의 값이 기존에 저장된 RoomNum 값과 중복되면 안 됩니다.

 

 

 

제약 조건에 이름을 설정하면, 다음과 같이 이름을 사용하여 해당 제약 조건을 삭제할 수 있습니다.

 

문법

ALTER TABLE 테이블이름

 

DROP INDEX 제약조건이름

 

 

 

UNIQUE 제약 조건을 설정하면, 해당 필드는 자동으로 인덱스(INDEX)로 만들어집니다.

 

다음 예제는 reservedRoom이라는 UNIQUE 제약 조건의 이름을 사용하여, 해당 제약 조건을 삭제하는 예제입니다.

 

예제

 

 

ALTER TABLE Reservation

 

DROP INDEX reservedRoom;

 

PRIMARY KEY

PRIMARY KEY 제약 조건을 설정하면, 해당 필드는 NOT NULLUNIQUE 제약 조건의 특징을 모두 가집니다.

 

따라서 이 제약 조건이 설정된 필드는 NULL 값을 가질 수 없으며, 또한 중복된 값을 가져서도 안 됩니다.

 

이러한 PRIMARY KEY 제약 조건을 기본 키라고 합니다.

 

 

 

UNIQUE는 한 테이블의 여러 필드에 설정할 수 있지만, PRIMARY KEY는 테이블당 오직 하나의 필드에만 설정할 수 있습니다.

 

이러한 PRIMARY KEY 제약 조건은 테이블의 데이터를 쉽고 빠르게 찾도록 도와주는 역할을 합니다.

 

CREATE 문으로 PRIMARY KEY 설정

CREATE 문에서 테이블을 생성할 때 다음과 같이 PRIMARY KEY 제약 조건을 설정할 수 있습니다.

 

 

 

CREATE 문으로 테이블을 생성할 때 해당 필드의 타입 뒤에 PRIMARY KEY를 명시하면, 해당 필드가 기본 키로 설정됩니다.

 

문법

1. CREATE TABLE 테이블이름

 

(

 

필드이름 필드타입 PRIMARY KEY,

 

...

 

)

2. CREATE TABLE 테이블이름

 

(

 

필드이름 필드타입,

 

...,

 

[CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)

 

)

 

 

 

위의 두 문법은 모두 해당 필드에 PRIMARY KEY 제약 조건을 설정합니다.

 

이때 두 번째 문법을 사용하면, 해당 제약 조건에 이름을 설정할 수 있습니다.

 

 

 

다음 예제는 CREATE TABLE 문을 사용하여 Test 테이블을 생성하면서 ID 필드를 기본 키로 설정하는 예제입니다.

 

이렇게 ID 필드를 기본 키로 설정한 후에 DESCRIBE 문을 사용하여 Test 테이블의 상세 정보를 확인하면, 다음 실행 결과와 같이 나타납니다.

 

예제

CREATE TABLE Test

 

(

 

ID INT PRIMARY KEY,

 

Name VARCHAR(30),

 

ReserveDate DATE,

 

RoomNum INT

 

);

그리고서 INSERT INTO 문을 사용하여 ID 필드의 값으로 NULL을 가지는 레코드와 같은 ID 필드 값을 가지는 2개의 레코드를 추가합니다.

 

이때 새로운 레코드를 추가하는 첫 번째와 세 번째 INSERT INTO 문은 에러를 발생시킵니다.

 

ALTER 문으로 PRIMARY KEY 설정

ALTER 문으로 테이블에 새로운 필드를 추가하거나 수정할 때도 PRIMARY KEY 제약 조건을 설정할 수 있습니다.

 

 

 

테이블에 새로운 필드를 추가할 때 해당 필드를 기본 키로 설정하는 문법은 다음과 같습니다.

 

문법

1. ALTER TABLE 테이블이름

 

ADD 필드이름 필드타입 PRIMARY KEY

 

2. ALTER TABLE 테이블이름

 

ADD [CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)

 

 

 

또한, 기존에 존재하는 필드를 기본 키로 설정하는 문법은 다음과 같습니다.

 

문법

1. ALTER TABLE 테이블이름

 

MODIFY COLUMN 필드이름 필드타입 PRIMARY KEY

 

2. ALTER TABLE 테이블이름

 

MODIFY COLUMN [CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)

PRIMARY KEY 제약 조건을 추가할 기존 필드는 NULL 값을 갖지 않도록 먼저 선언되어 있어야 합니다.

 

다음 예제는 ALTER TABLE 문을 사용하여 Reservation 테이블의 ID 필드에 CustomerID라는 이름을 가지는 PRIMARY KEY 제약 조건을 설정하는 예제입니다.

 

이렇게 ID 필드에 PRIMARY KEY 제약조건을 설정한 후에 DESCRIBE 문을 사용하여 Reservation 테이블의 상세 정보를 확인하면, 다음 실행 결과와 같이 나타납니다.

 

예제

 

 

ALTER TABLE Reservation

 

CONSTRAINT CustomerID ADD PRIMARY KEY (ID);

 

 

리고서 INSERT INTO 문을 사용하여 ID 필드의 값으로 NULL을 가지는 레코드와 같은 ID 필드 값을 가지는 2개의 레코드를 추가합니다.

 

이때 새로운 레코드를 추가하는 두 번째와 세 번째 INSERT INTO 문은 에러를 발생시킵니다.

 

 

 

다음과 같은 방법을 사용하여 설정된 PRIMARY KEY 제약 조건을 삭제할 수 있습니다.

 

문법

ALTER TABLE 테이블이름

 

DROP PRIMARY KEY

 

 

 

다음 예제는 Reservation 테이블에서 PRIMARY KEY 제약 조건을 삭제하는 예제입니다.

 

예제

 

 

ALTER TABLE Reservation

 

DROP PRIMARY KEY;

 

 

FOREIGN KEY

FOREIGN KEY 제약 조건을 설정한 필드는 외래 키라고 부르며, 한 테이블을 다른 테이블과 연결해주는 역할을 합니다.

 

외래 키가 설정된 테이블에 레코드를 입력하면, 기준이 되는 테이블의 내용을 참조해서 레코드가 입력됩니다.

 

, FOREIGN KEY 제약 조건은 하나의 테이블을 다른 테이블에 의존하게 만듭니다.

 

 

 

FOREIGN KEY 제약 조건을 설정할 때 참조되는 테이블의 필드는 반드시 UNIQUEPRIMARY KEY 제약 조건이 설정되어 있어야 합니다.

 

CREATE 문으로 FOREIGN KEY 설정

CREATE 문에서 테이블을 생성할 때 다음과 같이 FOREIGN KEY 제약 조건을 설정할 수 있습니다.

 

 

 

CREATE 문으로 테이블을 생성할 때 해당 필드의 타입 뒤에 FOREIGN KEY를 명시하면, 해당 필드가 외래 키로 설정됩니다.

 

문법

CREATE TABLE 테이블이름

 

(

 

필드이름 필드타입,

 

...,

 

[CONSTRAINT 제약조건이름]

 

FOREIGN KEY (필드이름)

 

REFERENCES 테이블이름 (필드이름)

 

)

 

 

 

위의 문법을 사용하면 해당 필드에 FOREIGN KEY 제약 조건을 설정합니다.

 

이때 참조되는 테이블의 이름은 REFERENCES 키워드 다음에 명시됩니다.

 

 

 

다음 예제는 Test2 테이블의 ParentID 필드에 Test1 테이블의 ID 필드를 참조하는 FOREIGN KEY 제약 조건을 설정하는 예제입니다.

 

예제

CREATE TABLE Test2

 

(

 

ID INT,

 

ParentID INT,

 

FOREIGN KEY (ParentID)

 

REFERENCES Test1(ID) ON UPDATE CASCADE

 

);

 

위의 예제에서 Test2 테이블의 ParentID 필드는 Test1 테이블의 ID 필드를 참조하도록 설정됩니다.

 

따라서 Test1 테이블의 ID 필드가 변경되면, 같은 값의 Test2 테이블의 ParentID 필드도 같이 변경됩니다.

 

ALTER 문으로 FOREIGN KEY 설정

ALTER 문으로 테이블에 새로운 필드를 추가하거나 수정할 때도 FOREIGN KEY 제약 조건을 설정할 수 있습니다.

 

 

 

테이블에 새로운 필드를 추가할 때 해당 필드를 외래 키로 설정하는 문법은 다음과 같습니다.

 

문법

ALTER TABLE 테이블이름

 

ADD [CONSTRAINT 제약조건이름]

 

FOREIGN KEY (필드이름)

 

REFERENCES 테이블이름 (필드이름)

 

 

 

다음 예제는 Reservation 테이블의 ID 필드에 Customer 테이블의 ID 필드를 참조하는 FOREIGN KEY 제약 조건을 설정하는 예제입니다.

 

예제

ALTER TABLE Reservation

 

ADD CONSTRAINT CustomerID

 

FOREIGN KEY (ID)

 

REFERENCES Customer (ID);

 

다음과 같은 방법을 사용하여 FOREIGN KEY 제약 조건을 삭제할 수 있습니다.

 

문법

ALTER TABLE 테이블이름

 

DROP FOREIGN KEY 제약조건이름

 

 

 

다음 예제는 Reservation 테이블의 ID 필드에 설정된 FOREIGN KEY 제약 조건을 삭제하는 예제입니다.

 

예제

 

 

ALTER TABLE Reservation

 

DROP FOREIGN KEY CustomerID;

 

 

DEFAULT

DEFAULT 제약 조건은 해당 필드의 기본값을 설정할 수 있게 해줍니다.

 

만약 레코드를 입력할 때 해당 필드 값을 전달하지 않으면, 자동으로 설정된 기본값을 저장합니다.

 

CREATE 문으로 DEFAULT 설정

CREATE 문에서 테이블을 생성할 때 다음과 같이 제약 조건을 설정할 수 있습니다.

 

 

 

CREATE 문으로 테이블을 생성할 때 해당 필드의 타입 뒤에 DEFAULT를 명시하면, 해당 필드의 기본값을 설정할 수 있습니다.

 

문법

CREATE TABLE 테이블이름

 

(

 

필드이름 필드타입 DEFAULT 기본값,

 

...

 

)

 

 

 

다음 예제는 CREATE TABLE 문을 사용하여 Test 테이블을 생성하면서 Name 필드에 DEFAULT 제약 조건을 이용하여 기본값을 설정하는 예제입니다.

 

이렇게 Name 필드에 기본값을 설정한 후에 DESCRIBE 문을 사용하여 Test 테이블의 상세 정보를 확인하면, 다음 실행 결과와 같이 나타납니다.

 

예제

CREATE TABLE Test

 

(

 

ID INT,

 

Name VARCHAR(30) DEFAULT 'Anonymous',

 

ReserveDate DATE,

 

RoomNum INT

 

);

그리고서 INSERT INTO 문을 사용하여 Name 필드의 값을 가지지 않는 새로운 레코드를 추가합니다.

 

이처럼 새로운 레코드를 추가할 때 Name 필드 값을 전달하지 않으면, 자동으로 기본값인 'Anonymous'가 저장됩니다.

 

ALTER 문으로 DEFAULT 설정

ALTER 문으로 테이블에 새로운 필드를 추가하거나 수정할 때도 DEFAULT 제약 조건을 설정할 수 있습니다.

 

 

 

테이블에 새로운 필드를 추가할 때 DEFAULT 제약 조건을 설정하는 문법은 다음과 같습니다.

 

문법

ALTER TABLE 테이블이름

 

ADD 필드이름 필드타입 DEFAULT 기본값

 

 

 

기존 필드에 DEFAULT 제약 조건을 설정하는 문법은 다음과 같습니다.

 

문법

1. ALTER TABLE 테이블이름

 

MODIFY COLUMN 필드이름 필드타입 DEFAULT 기본값

 

2. ALTER TABLE 테이블이름

 

ALTER 필드이름 SET DEFAULT 기본값

 

 

 

위의 두 문법은 모두 해당 필드에 DEFAULT 제약 조건을 설정합니다.

 

 

 

다음 예제는 ALTER TABLE 문을 사용하여 Reservation 테이블의 Name 필드에 DEFAULT 제약 조건을 이용하여 기본값을 설정하는 예제입니다.

 

이렇게 Name 필드에 DEFAULT 제약조건을 설정한 후에 DESCRIBE 문을 사용하여 Reservation 테이블의 상세 정보를 확인하면, 다음 실행 결과와 같이 나타납니다.

 

예제

 

 

ALTER TABLE Reservation

 

ALTER Name SET DEFAULT 'Anonymous';

 

 

그리고서 INSERT INTO 문을 사용하여 Name 필드의 값을 가지지 않는 새로운 레코드를 추가합니다.

 

이처럼 새로운 레코드를 추가할 때 Name 필드 값을 전달하지 않으면, 자동으로 기본값인 'Anonymous'가 저장됩니다.

 

 

 

다음과 같은 방법을 사용하여 DEFAULT 제약 조건을 삭제할 수 있습니다.

 

문법

ALTER TABLE 테이블이름

 

ALTER 필드이름 DROP DEFAULT

 

 

 

다음 예제는 Reservation 테이블의 Name 필드에 설정된 DEFAULT 제약 조건을 삭제하는 예제입니다.

 

예제

 

 

ALTER TABLE Reservation

 

ALTER Name DROP DEFAULT;

 

 

'MySQL' 카테고리의 다른 글

MySQL 인덱스  (0) 2020.07.02
MySQL 연산  (0) 2020.07.02
MySQL 연산자  (0) 2020.07.02
MySQL 타입  (0) 2020.07.02
MySQL 문법  (0) 2020.07.02

댓글