# Constraints

### **컬럼에 Constraints (제약조건) 주기**

컬럼만들 때 제약조건을 걸어둘 수 있습니다.&#x20;

\- 이 컬럼은 NOT NULL 해야한다 (텅빈 데이터 집어넣지 말아라)

\- 이 컬럼에 있는 데이터들은 항상 UNIQUE 해야한다&#x20;

\- 여기에 음수말고 양수만 들어오는지 CHECK 하라

\- 이 컬럼을 PRIMARY KEY로 설정하라

등 여러가지 설정이 가능합니다.&#x20;

### **1. NOT NULL 제약조건**

```sql
CREATE TABLE new_table3 (
    id NUMBER(38,0) NOT NULL,
    이름 VARCHAR(100) NOT NULL,
    나이 NUMBER(38,0)
) 
```

컬럼 만들 때 우측에 **NOT NULL**을 체크해주면 NULL 금지라는 제약을 걸 수 있습니다.

원래 데이터넣을 때 까먹고 안넣으면 자동으로 NULL이 됩니다.&#x20;

그래서 NOT NULL 입력해두면 나중에 이름컬럼이나 id컬럼에 까먹고 <mark style="color:yellow;">**데이터를 안넣으면 저장이 되지 않습니다.**</mark>

### **2. UNIQUE 제약조건**

```sql
CREATE TABLE new_table3 (
    id NUMBER(38,0) UNIQUE,
    이름 VARCHAR(100),
    나이 NUMBER(38,0)
) 
```

컬럼 만들 때 우측에 **UNIQUE** 를 체크해주면 UNIQUE 라는 제약을 걸 수 있습니다.

UNIQUE가 붙어있는 컬럼안에선 모든 행이 각각 다른 데이터를 가지고 있어야합니다.

그래서 **다른 행에 있는 값을 저장하려고 하면 저장이 안됩니다.**&#x20;

진짜인지 테스트해봅시다.&#x20;

```sql
CREATE TABLE new_table3 (
    id NUMBER(38,0),
    이름 VARCHAR(100),
    나이 NUMBER(38,0),
    UNIQUE(이름,나이)
)
```

혹은 최하단에 UNIQUE(컬럼1, 컬럼2 ...) 이렇게 넣어도 됩니다.

근데 이렇게 2개 이상의 컬럼을 넣게될 경우 컬럼1과 컬럼2 값이 전부 같아야 저장을 막아줍니다.&#x20;

| id | 이름  | 나이 |
| -- | --- | -- |
| 1  | aaa | 20 |
| 2  | aaa | 21 |

이건 저장을 허용해주는데

| d | 이름  | 나이 |
| - | --- | -- |
| 1 | aaa | 20 |
| 2 | aaa | 20 |

이건 저장이 안됩니다.

### **3. CHECK() 제약조건**

```sql
CREATE TABLE new_table3 (
    id NUMBER(38,0),
    이름 VARCHAR(100),
    나이 NUMBER(38,0) CHECK (나이 >0)
) 
```

컬럼만들 때 우측에 CHECK () 넣으면 **컬럼에 들어갈 값에 제약**을 둘 수 있습니다.

등호 부등호 AND OR 써서 조건식처럼 입력하면 됩니다. IN 연산자도 가능합니다.&#x20;

그레서 위처럼 해놓으면 이제 '나이' 컬럼에 음수 못넣음&#x20;

### **4. PRIMARY KEY 제약조건**&#x20;

row 하나 저장할 때 마다 id같은걸 기록해둬야 나중에 편리합니다.

| **학생이름** | **학년** | **반** |
| -------- | ------ | ----- |
| 김철수      | 1      | 2     |
| 김영희      | 1      | 2     |
| 이시우      | 2      | 3     |

예를 들어 DB에 학생 출석부를 저장하려면 학생의 이름 학년 반만 저장한다고 가정해봅시다.

2학년 3반에 이시우 학생이 또 입학하면 어떻게 둘을 구분할까요???&#x20;

그래서 학생마다 유니크한 번호를 달아놔야 좋지 않을까요.&#x20;

| **학번** | **학생이름** | **학년** | **반** |
| ------ | -------- | ------ | ----- |
| 1      | 김철수      | 1      | 2     |
| 2      | 김영희      | 1      | 2     |
| 3      | 이시우      | 2      | 3     |
| 4      | 이시우      | 2      | 3     |

각 학생마다 유니크한 학번을 부여하면 나중에 동일한 이름의 데이터가 들어와도 각각 구분짓기가 가능합니다.&#x20;

여기서 '학번' 컬럼을 primary key 라고 부릅니다.&#x20;

primary key는 각 행을 구분짓기 위해 각각 유니크한 데이터를 담고있는 컬럼입니다.&#x20;

\- 문자 넣어도 되는데 보통은 1씩 증가하는 숫자를 주로 넣습니다.

\- 자신있으면 없어도 상관없는데 보통은 테이블마다 만들어놓는게 좋습니다.

\- 여러 컬럼을 묶어서 primary key로 지정이 가능합니다. 여러 컬럼 묶은 결과가 각 행마다 유니크하기만 하면 됩니다.

```sql
CREATE TABLE new_table3 (
    id NUMBER(38,0) PRIMARY KEY,
    이름 VARCHAR(100),
    나이 NUMBER(38,0) CHECK (나이 >0)  
) 
```

컬럼만들 때 우측에 PRIMARY KEY 라고 표기하면 그 컬럼은 PRIMARY KEY 로 등록해둘 수 있습니다.&#x20;

그럼 NOT NULL, UNIQUE 제약조건도 자동으로 부여됩니다.

### 5. 컬럼값 자동 증가

```sql
CREATE TABLE new_table3 (
    id NUMBER(38,0) GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    이름 VARCHAR(100),
    나이 NUMBER(38,0) CHECK (나이 >0)
)
```

넣어두면 테이블에 행이 추가될 때 자동으로 알아서 1씩 증가된 값이 부여됩니다.&#x20;

(예시) 테이블의 마지막 행에 id가 100으로 기록되어있었다면

새로 행을 추가하면 알아서 id를 101로 설정해줍니다.&#x20;

\- PRIMARY KEY 조건 넣을 때 자주 함께 사용됩니다.

### **6. CONSTRAINTS() 문법으로 제약조건주기**

```sql
CREATE TABLE new_table3 (
    id NUMBER(38,0) ,
    이름 VARCHAR(100),
    나이 NUMBER(38,0) ,
    PRIMARY KEY (id),
    CHECK (나이 >0)
);

CREATE TABLE new_table3 (
    id NUMBER(38,0) ,
    이름 VARCHAR(100),
    나이 NUMBER(38,0) ,
    CONSTRAINT 제약조건명1 PRIMARY KEY (id),
    CONSTRAINT 제약조건명2 CHECK (나이 >0)
);
```

제약조건 줄 때 밑에 이렇게 써도 됩니다.

&#x20;제약조건마다 작명을 해서 귀엽게 이름붙여주고 싶으면 CONSTRAINT 문법을 씁니다.

이렇게 해두면 나중에 에러가 날 때 "제약조건명2 때문에 에러가 납니다" 이런 식으로 표기가 되므로&#x20;

SQL 코드가 동작하지 않을 때 버그찾는 과정이 좀 더 편리할 수 있습니다.&#x20;

### **7. 제약조건 추가**

```sql
ALTER TABLE new_table3 MODIFY 나이 NUMBER(38,0) NOT NULL; 
```

### **8. 제약조건 삭제**

```sql
ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건이름;
```

<figure><img src="/files/7OeJEkiYPciOwAO5ixPP" alt=""><figcaption></figcaption></figure>

생성한 제약조건은 Constraints 탭에서 확인할 수 있다.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://leeans-dev-book.gitbook.io/docs/lecture/database/constraints.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
