컬럼에 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이 추가됩니다.
'Mysql&DBeaver' 카테고리의 다른 글
DBeaver)제3정규형 (3NF) & Foreign Key (0) | 2024.09.06 |
---|---|
DBeaver)정규형 알면 DB 설계 가능 (1NF, 2NF) (2) | 2024.09.06 |
DBeaver)중요한 IF / CASE 문법 (0) | 2024.09.06 |
DBeaver)그룹지어 통계낼 땐 GROUP BY (1) | 2024.09.06 |
DBeaver)SELECT 안에 SELECT 또 쓸 수 있음 (서브쿼리) (0) | 2024.09.06 |