Mysql&DBeaver

DBeaver)컬럼에 안전하게 제약 (Constraints) 주기

연습노트 2024. 9. 6. 13:16

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

 

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

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

- 이 컬럼에 있는 데이터들은 항상 UNIQUE 해야한다 

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

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

등 여러가지 설정이 가능합니다. 

 

 

 

1. NOT NULL 제약조건

 

CREATE TABLE new_table (
    id INT NOT NULL,
    이름 VARCHAR(100) NOT NULL,
    나이 INT
) 

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

원래 데이터넣을 때 까먹고 안넣으면 자동으로 NULL이 됩니다. 텅비어있다는 뜻임 

그래서 NOT NULL 입력해두면 나중에 이름컬럼이나 id컬럼에 까먹고 데이터를 안넣으면 저장이 되지 않습니다.

NULL 금지라서요. 

 

 

 

 

 

 

 

 

2. UNIQUE 제약조건

 

CREATE TABLE new_table (
    id INT UNIQUE,
    이름 VARCHAR(100),
    나이 INT
) 

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

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

그래서 다른 행에 있는 값을 저장하려고 하면 저장이 안됩니다. 진짜인지 테스트해봅시다. 

 

 

CREATE TABLE new_table (
    id INT,
    이름 VARCHAR(100),
    나이 INT,
    UNIQUE(이름, 나이)
) 

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

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

 

id 이름 나이
1 aaa 20
2 aaa 21

 

이건 저장을 허용해주는데

 

 

id 이름 나이
1 aaa 20
2 aaa 20

 

이건 저장을 막는다는 소리입니다. 

쓸 일은 별로 없을 수 있어서 참고로 알아둡시다. 

 

 

 

 

 

 

 

3. CHECK() 제약조건

 

CREATE TABLE new_table (
    id INT,
    이름 VARCHAR(100),
    나이 INT CHECK (나이 > 0),
) 

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

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

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

 

 

 

 

 

 

 

 

잠깐 상식 : PRIMARY KEY

 

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

 

학생이름 학년
김철수 1 2
박민기 1 2
이율곡 2 3

 

▲ 예를 들어 DB에 학생 출석부를 저장하려면 학생의 이름 학년 이런것만 저장할겁니까?

2학년 3반에 이율곡 학생이 또 입학하면 어떻게 둘을 구분할 것임 

그래서 학생마다 유니크한 번호를 달아놔야 좋지않을까요. 학번같은거요.

 

 

 

학번 학생이름 학년
1 김철수 1 2
2 박민기 1 2
3 이율곡 2 3
4 이율곡 2 3

 

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

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

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

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

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

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

 

 

 

 

 

 

4. PRIMARY KEY 제약조건 

 

CREATE TABLE new_table (
    id INT PRIMARY KEY,
    이름 VARCHAR(100),
    나이 INT CHECK (나이 > 0),
) 

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

그럼 NOT NULL, UNIQUE 제약조건도 자동으로 부여됩니다. 안되면 직접 넣으면 됩니다. 

 

 

 

 

 

 

 

5. AUTO_INCREMENT 제약조건

 

CREATE TABLE new_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    이름 VARCHAR(100),
    나이 INT,
) 

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

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

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

- PRIMARY KEY 조건 넣을 때 자주 함께 사용됩니다. 편해서요

 

 

 

 

CREATE TABLE new_table (
    id NUMBER GENERATED BY DEFAULT ALWAYS AS IDENTITY
) 

실은 원래 이게 SQL 표준문법이라 Oracle, PostgreSQL은 이 문법을 씁니다. 

그럼 이제 id 컬럼에 primary key + auto increment 제약조건 부여가 가능합니다. 

Postgres는 NUMBER가 아니라 INT 이런거 쓰면 됩니다. 

 

 

 

 

 

 

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

 

 

CREATE TABLE new_table (
    id INT,
    이름 VARCHAR(100),
    나이 INT,
    PRIMARY KEY (id),
    CHECK(나이 > 10)
) 

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

 

 

CREATE TABLE new_table (
    id INT,
    이름 VARCHAR(100),
    나이 INT,
    CONSTRAINT 제약조건작명 PRIMARY KEY (id),
    CONSTRAINT 제약조건작명2 CHECK(나이 > 10)
) 

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

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

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

 

 

 

 

 

 

참고 : 이미 있는 컬럼에 제약을 추가하려면 

 

ALTER TABLE 테이블명 MODIFY 컬럼명 int NOT NULL; 

컬럼 수정해주는 ALTER TABLE 문법을 쓰면 됩니다.

위 처럼 코드짜면 기존 컬럼에 NOT NULL이 추가됩니다.