> For the complete documentation index, see [llms.txt](https://leeans-dev-book.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://leeans-dev-book.gitbook.io/docs/lecture/database/constraints.md).

# 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 탭에서 확인할 수 있다.
