TIL

24.01.26

아리단길아조씨 2024. 1. 26. 20:52
728x90

 NULL 제약 조건 

NULL 값을 허용하는 것은, 필수적으로 입력되어야 하는 데이터가 
누락될 수 있는 위험이 발생할 수 있다.

NULL 값을 허용하지 않는 방법
NOT NULL을 붙여준다.
EX) name varchar(255) not null => 255는 컬럼에 올 수 있는 갯수

고유(Unique) 제약 조건
- 중복된 값이 허용되지 않도록 설정하는 조건임. 
 name varchar(255) not null unique
=> name 이라는 컬럼은 문자 타입이고, 값이 있어야하며,
무조건 특정하게 고유해야한다.

고유 제약 조건 확인하기

INSERT INTO Users (name) VALUES ('김춘자);
INSERT INTO Users (name) VALUES ('김춘자);

Error: ER_DUP_ENTRY: Duplicate entry '김춘자' for key 'Users.name'
UBIQUE라는 제약 조건이 걸려 있어서 중복되는 데이터를 
해당하는 테이블에 삽입할 수 없다는 에러
(UNIQUE 제약 조건이 정상적으로 설정, 작동하는 것을 확인)


외래 키(Foreign key) 제약 조건
=> 테이블과 다른 테이블간의 관계를 맺을 때 사용하는 제약 조건
외래 키는 테이블간의 연관 관계를 표현할 때 사용한다.
연관 관계는 대표적으로 3가지의 형태로 표현할 수 있다

1 : 1 => 1명의 사용자는 1개의 사용자 정보를 가질 수 있다.
1 : N => 1명의 사용자는 여러개의 주문을 할 수 있다.
N : M => 여러명의 학생은 여러개의 학원을 등록할 수 있다.

CREATE TABLE 테이블명
FOREIGN KEY (컴럼명) REFERENCES 참조_테이블명 (참조_컬럼명)
ON DELETE [연계 참조 제약 조건]
ON UPDATE [연계 참조 제약 조건]
);
* 기본적으로, 외래 키 제약 조건은 CREATE TABLE 문을 사용하여
테이블을 생성함과 동시에 정의한다.

외래 키 (Foreign Key) 제약 조건 심화

외래 키의 경우 다른 테이블과 관계를 맺고 잇는 참조 데이터가 삭제(DELETE)
수정(UPDATE)될 때 어떤 행위를 해야하는지 설정할 수 있다.
이런 행위를 수행하는 조건을 연계 참조 무결성 제약 조건이라고 함

연계 참조 무결성 제약의 조건 종류

1. CASCADE
- 참조하고 있는 개체가 변경/삭제된다.
=> 사용자가 삭제된다면, 그 사용자의 모든 주문 내역도 삭제가 된다.
FOREIGN KEY (userId) REFERENCES Users(userId)
ON DELETE CASCADE
ON UPDATE CASCADE;

2. NO ACTION
- 참조하고 있는 개체가 변경/삭제 될 경우 아무런 행위를 하지 않고 에러가 발생한다.
=> 사용자를 삭제할 때, 사용자의 주문 내역이 아직 존재한다면, 삭제를 막는다.
FOREIGN KEY (userId) REFERENCES Users(userId)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

3. SET NULL
- 참조하고 있는 개체가 변경/삭제 될 경우 현재 데이터를 NULL로 변경한다.
=> 사용자가 삭제되면, 사용자의 주문 내역의 '사용자 ID'는 NULL로 변경
FOREIGN KEY (userId) REFERENCES Users(userId)
ON DELETE SET NULL
ON UPDATE SET NULL;

4. SET DEFAULT
- 참조하고 있는 객체가 변경/삭제 될 경우 현재 데이터를 기본 값으로 변경한다.
=> 사용자가 삭제되면, 사용자의 주문 내역의 '사용자ID'는 기본 값으로 변경
* DEFAULT 값에 값을 셋팅하지 않으면 기본적으로 NULL이 반환된다.
FOREIGN KEY (userId) REFERENCES Users(userId)
ON DELETE SET DEFAULT
ON UPDATE SET DEFAULT;

SELECT JOIN 연산자
JOIN 연산자는 두 테이블 사이의 공통된 데이터를 기준으로 테이블을 연결하여
하나의 테이블처럼 조회 할 수 있게 해주는 연산자임.
* JOIN 연산자는 SQL의 제약 조건은 아님. 여러 테이블 간의 외래 키로 설정된
컬럼들을 연결하여 조회하는 SELECT 연산자의 활용법 중 하나임.

-- -- 테이블 만들어주기
-- CREATE TABLE Users
-- (
--     -- NOT NULL 은 제약조건이다.
--     --  userId는 기본 키를 가지며, 무조건 값이 입력 되어야하고, 데이터를 넣지 않았을 때는 자동적으로 숫자를 1씩 증가시키며 숫자형이다.
--     userId   int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
--     -- email 컬럼은 값이 무조건 입력 되어야 하고, 문자열이 와야함
--     email    varchar(255) NOT NULL,
--     -- password 컬럼은 값이 무조건 입력되어야 하고, 문자열이 온다.
--     password varchar(255) NOT NULL 
-- );

-- CREATE TABLE Posts
-- (
--     postId  int(11)      NOT NULL AUTO_INCREMENT PRIMARY KEY,
--     userId  int(11)      NOT NULL,
--     title   varchar(255) NOT NULL,
--     content varchar(255) NOT NULL,
--     -- FOREIGN KEY 는 관계를 맺게 해준다.(Users 테이블의 usersId와 Posts 테이블의 usersId의 관계를 주선해준다.)
--     FOREIGN KEY (userId) REFERENCES Users (userId)
-- );

-- -- 데이터 넣어주기
-- INSERT INTO Users (userId, email, password)
-- VALUES (1, 'AAAA', '1234'),
--        (2, 'BBBB', '1234');

-- INSERT INTO Posts (userId, title, content)
-- VALUES (1, 'AAAA Title1', 'content'),
--        (1, 'AAAA Title2', 'content'),
--        (2, 'BBBB Title1', 'content'),
--        (2, 'BBBB Title2', 'content');

-- SELECT * FROM Users; -- Users 테이블 조회하기
-- SELECT * FROM Posts; -- Posts 테이블 조회하기

-- SELECT JOIN 연산자를 통해 한번에 두 가지 테이블을 함께 조회한다. 
-- -- Posts 테이블의 postId, title, content 컬럼 조회하고, Users 테이블의 email 컬럼을 조회한다.
SELECT p.postId, p.title, p.content, u.email 
FROM Posts as p -- 1번 째로 Posts 라는 테이블을 조회하는데 이름을 p로 바꾼다
JOIN Users as u -- 2번 째로 Users 라는 테이블을 조회하는데 이름을 u로 바꾼다
-- ON에서는 어떤 것들이 연관을 맺고 있는지 기재해야한다. 
--중복되는 데이터들은 삭제가 되고 동일한 userId를 갖고 있는 것만 표시하게 하는 문법
ON p.userId = u.userId; 

별칭(alias)은 여러개의 테이블을 참조할 때, 특정 테이블을 간단하게 나타내기 위해 사용한다.
- 별칭을 사용하지 않을 경우 모든 컬럼에 테이블명을 있는 그대로 작성해야함.
만약 테이블의 이름이 길게 정의되어 있을 경우 나쁜 코드 냄새가 나는 코드로 구현될 것임.

JOIN ... ON 의 역할
- 두 개 이상의 테이블을 결합할 때, 어떤 조건으로 테이블을 결합할 것인지를 정의할 때 사용한다.
- ON 뒤에는 결합 조건이 위치하며, 이는 두 테이블 간의 관계를 정의한다.

'TIL' 카테고리의 다른 글

24.01.31  (0) 2024.01.31
24.01.30  (0) 2024.01.30
24.01.25  (0) 2024.01.25
24.01.23 TIL  (1) 2024.01.23
24.01.22  (2) 2024.01.22