일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 40HQ컨테이너40GP컨테이너차이
- 우레탄지퍼
- AATCC
- 엑셀드래그단축키
- 엑셀필터복사붙여넣기
- 고급영어단어
- 암홀트롭
- 슈퍼코딩
- 클린코드
- 봉제용어
- WHATTIMEOFTHEDAY
- 미니마카
- 지연환가료
- 헤이큐
- 40HQ컨테이너
- 와끼
- 나일론지퍼
- MERN스택
- 필터링후복사붙여넣기
- 웹API
- 영어시간읽기
- 엑셀자동서식
- 비슬론지퍼
- TACKING
- 자켓실측
- 비리짐
- Armhole Drop
- 요척합의
- 미국영어연음
- 핸드캐리쿠리어차이점
- Today
- Total
CASSIE'S BLOG
78-2강 MySQL 제약조건 익히기 본문
만드는 순간부터 참조하는 테이블이 먼저 있어야함
기준테이블을 못 삭제한다는 말임.
78-2강도 실습있다.
제일 먼저 DATABASE chapter_78 만들어줘야함
CREATE DATABASE chapter_78;
그 다음은 계속 USE chapter_78 써준다.
USE chapter_78;
DROP TABLE IF EXISTS buy_history_1;
DROP TABLE IF EXISTS group_singer;
CREATE TABLE group_singer (
mem_id CHAR(8) NOT NULL PRIMARY KEY, -- 가수 ID
mem_name VARCHAR(10) NOT NULL, -- 이름
mem_number INT NOT NULL, -- 인원 수
addr VARCHAR(2) NOT NULL, -- 주소(경기, 서울, 경남 식으로 2글자 입력)
phone VARCHAR(11), -- 전화번호 (하이픈 제외)
height SMALLINT, -- 평균 키
debut_date DATE -- 데뷔
);
CREATE TABLE buy_history (
buy_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 순번(PK)
mem_id CHAR(8) NOT NULL, -- 아이디(FK)
prod_name CHAR(6) NOT NULL, -- 제품 이름
group_name CHAR(4), -- 분류
price INT NOT NULL, -- 단가
amount SMALLINT NOT NULL, -- 수량
FOREIGN KEY (mem_id) REFERENCES group_singer(mem_id)
);
FOREIGN KEY는 인라인으로 안됨.
DATA를 넣어준다.GROUP_SINGER
USE chapter_78;
INSERT INTO group_singer (mem_id, mem_name, mem_number, addr, phone, height, debut_date)
VALUES
-- 서울
('mem001', '방탄소년단', 7, '서울', '01012345678', 178, '2013-06-13'),
('mem002', 'EXO', 9, '서울', '01023456789', 183, '2012-04-08'),
('mem004', '블랙핑크', 4, '서울', '01045678901', 165, '2016-08-08'),
('mem005', '뉴이스트', 5, '서울', '01056789012', 177, '2012-03-15'),
('mem006', '위너', 4, '서울', '01067890123', 180, '2014-08-12'),
('mem007', '레드벨벳', 5, '서울', '01078901234', 160, '2014-08-01'),
('mem008', '세븐틴', 13, '서울', '01089012345', 175, '2015-05-26'),
('mem009', '아이유', 1, '서울', '01090123456', 162, '2008-09-18'),
('mem011', '갓세븐', 7, '서울', '01012345678', 178, '2014-01-20'),
('mem012', '비투비', 7, '서울', '01023456789', 180, '2012-03-21'),
('mem013', '에이핑크', 6, '서울', '01034567890', 165, '2011-04-19'),
('mem015', '모모랜드', 9, '서울', '01056789012', 167, '2016-11-10'),
('mem016', '엑소', 9, '서울', '01067890123', 183, '2012-04-08'),
('mem017', '있지', 5, '서울', '01078901234', 165, '2019-02-12'),
('mem019', 'TXT', 5, '서울', '01090123456', 179, '2019-03-04'),
('mem020', 'NCT', 23, '서울', '01001234567', 176, '2016-04-09'),
('mem021', '오마이걸', 7, '서울', '01012345678', 165, '2015-04-20'),
('mem022', '스트레이 키즈', 8, '서울', '01023456789', 172, '2018-03-26'),
('mem023', '에버글로우', 6, '서울', '01034567890', 168, '2019-03-18'),
('mem025', '소녀시대', 8, '서울', '01056789012', 165, '2007-08-05'),
('mem026', '워너원', 11, '서울', '01067890123', 174, '2017-08-07'),
('mem027', '오마이걸', 7, '서울', '01078901234', 165, '2015-04-20'),
('mem029', '몬스타엑스', 7, '서울', '01090123456', 181, '2015-05-14'),
-- 경기
('mem003', '트와이스', 9, '경기', '01034567890', 163, '2015-10-20'),
('mem010', '마마무', 4, '경기', '01001234567', 162, '2014-06-18'),
('mem018', 'ITZY', 5, '경기', '01089012345', 166, '2019-02-12'),
-- 경상도
('mem014', '세븐', 1, '경남', '01098765432', 178, '2003-03-08'),
-- 전라도
('mem024', '박진영', 1, '전남', '01087654321', 180, '1992-09-24'),
-- 충청도
('mem028', '트레저', 12, '충북', '01076543210', 176, '2020-08-07');
DATA를 넣어준다.
-- buy_history 테이블에 새로운 데이터 삽입
USE chapter_78;
INSERT INTO buy_history (mem_id, prod_name, group_name, price, amount)
VALUES
('mem001', '아메리카노', '음료', 2500, 2),
('mem001', '샌드위치', '식품', 3500, 1),
('mem002', '요구르트', '음료', 1500, 3),
('mem002', '샐러드', '식품', 5000, 1),
('mem003', '핫도그', '식품', 2500, 2),
('mem003', '아이스크림', '간식', 2000, 3),
('mem004', '커피', '음료', 3000, 2),
('mem004', '과자', '간식', 2000, 4),
('mem005', '스포츠 음료', '음료', 3500, 1),
('mem005', '새우깡', '간식', 1500, 2),
('mem006', '콜라', '음료', 2000, 2),
('mem006', '떡볶이', '식품', 3000, 1),
('mem007', '사이다', '음료', 1800, 4),
('mem007', '과일', '식품', 4000, 1),
('mem008', '커피라떼', '음료', 3000, 3),
('mem008', '감자칩', '간식', 2500, 2),
('mem009', '차', '음료', 1500, 1),
('mem009', '파이', '간식', 3000, 1),
('mem010', '코코아', '음료', 2000, 2),
('mem010', '새우튀김', '간식', 3500, 3),
('mem011', '햄버거', '음식', 5000, 1),
('mem011', '피자', '음식', 6000, 2),
('mem012', '샌드위치', '식품', 3500, 1),
('mem012', '과일 주스', '음료', 3000, 3),
('mem013', '과자', '간식', 2000, 2),
('mem013', '커피젤리', '간식', 2500, 1),
('mem014', '라면', '식품', 2500, 3),
('mem014', '스포츠 음료', '음료', 3500, 2),
('mem015', '과일', '식품', 4000, 1),
('mem015', '아이스크림', '간식', 2000, 4),
('mem001', '아메리카노', '음료', 2500, 2),
('mem001', '샌드위치', '식품', 3500, 1),
('mem002', '요구르트', '음료', 1500, 3),
('mem002', '샐러드', '식품', 5000, 1),
('mem003', '핫도그', '식품', 2500, 2),
('mem003', '아이스크림', '간식', 2000, 3),
('mem004', '커피', '음료', 3000, 2),
('mem004', '과자', '간식', 2000, 4),
('mem005', '스포츠 음료', '음료', 3500, 1),
('mem005', '새우깡', '간식', 1500, 2),
('mem006', '콜라', '음료', 2000, 2),
('mem006', '떡볶이', '식품', 3000, 1),
('mem007', '사이다', '음료', 1800, 4),
('mem007', '과일', '식품', 4000, 1),
('mem008', '커피라떼', '음료', 3000, 3),
('mem008', '감자칩', '간식', 2500, 2),
('mem009', '차', '음료', 1500, 1),
('mem009', '파이', '간식', 3000, 1),
('mem010', '코코아', '음료', 2000, 2),
('mem010', '새우튀김', '간식', 3500, 3),
('mem011', '햄버거', '음식', 5000, 1),
('mem011', '피자', '음식', 6000, 2),
('mem012', '샌드위치', '식품', 3500, 1),
('mem012', '과일 주스', '음료', 3000, 3),
('mem013', '과자', '간식', 2000, 2),
('mem013', '커피젤리', '간식', 2500, 1),
('mem014', '라면', '식품', 2500, 3),
('mem014', '스포츠 음료', '음료', 3500, 2),
('mem015', '과일', '식품', 4000, 1),
('mem015', '아이스크림', '간식', 2000, 4);
테스트하려고 언더바_1 있는거를 테이블을 더 추가해서 다시 만들어줌
USE chapter_78;
DROP TABLE IF EXISTS buy_history_1;
DROP TABLE IF EXISTS group_singer_1;
CREATE TABLE group_singer_1 (
mem_id CHAR(8) NOT NULL PRIMARY KEY, -- 가수 ID
mem_name VARCHAR(10) NOT NULL, -- 이름
mem_number INT NOT NULL, -- 인원 수
addr VARCHAR(2) NOT NULL, -- 주소(경기, 서울, 경남 식으로 2글자 입력)
phone VARCHAR(11), -- 전화번호 (하이픈 제외)
height SMALLINT, -- 평균 키
debut_date DATE -- 데뷔
);
CREATE TABLE buy_history_1 (
buy_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 순번(PK)
mem_id CHAR(8) NOT NULL, -- 아이디(FK)
prod_name CHAR(6) NOT NULL, -- 제품 이름
group_name CHAR(4), -- 분류
price INT NOT NULL, -- 단가
amount SMALLINT NOT NULL, -- 수량
FOREIGN KEY (mem_id) REFERENCES group_singer(mem_id)
);
buy_history_1에 CASCADE와 관련된 옵션을 변경해주는 코드
ALTER TABLE buy_history_1
ADD CONSTRAINT mem_id_fk2
FOREIGN KEY(mem_id) REFERENCES group_singer(mem_id)
ON UPDATE CASCADE;
바뀐다는데 안 바뀌는데 이해 못한 것 같은데.. 나 다시 정리하기
DELETE 옵션까지 넣은 코드
ALTER TABLE buy_history_1
ADD CONSTRAINT mem_id_fk2
FOREIGN KEY(mem_id) REFERENCES group_singer(mem_id)
ON UPDATE CASCADE
ON DELETE CASCADE;
지금 바로 하면 안되서.. 드롭하고 다시 만들어야함 왜냐면 처음에 ON UPDATE CASCADE만 있는 제약조건을 추가를 했기때문에
ALTER TABLE buy_history_1 DROP FOREIGN KEY mem_id_fk2;
ALTER TABLE buy_history_1
ADD CONSTRAINT mem_id_fk2
FOREIGN KEY(mem_id) REFERENCES group_singer(mem_id)
ON UPDATE CASCADE
ON DELETE CASCADE;
FOREIGN KEY가 제약조건의 하나임.
SQL에서 제약 조건(constraint)은 테이블의 데이터를 제약하고 데이터 무결성을 유지하는 규칙을 정의하는데 사용됩니다. 외래 키는 이러한 제약 조건 중 하나로, 한 테이블의 열이 다른 테이블의 열과 연결되도록 보장하는 역할을 합니다.
주요 제약 조건(Constraints)의 종류:
- PRIMARY KEY: 테이블의 각 행을 고유하게 식별하는 열을 지정합니다. 기본 키는 중복을 허용하지 않으며, NULL 값을 가질 수 없습니다.
- FOREIGN KEY: 한 테이블의 열이 다른 테이블의 열과 관계를 맺도록 하는 제약 조건입니다. 외래 키를 통해 데이터 무결성을 유지하고, 참조 무결성(Referential Integrity)을 보장할 수 있습니다.
- UNIQUE: 해당 열의 값이 테이블 내에서 유일해야 함을 보장합니다. (중복 값 금지)
- NOT NULL: 해당 열의 값이 NULL을 가질 수 없도록 합니다.
- CHECK: 특정 조건을 만족하는지 여부를 확인하는 제약 조건입니다.
FOREIGN KEY 제약 조건
FOREIGN KEY는 두 테이블 간의 관계를 나타냅니다. 외래 키는 한 테이블의 컬럼이 다른 테이블의 기본 키(또는 UNIQUE 키)와 일치해야 함을 보장합니다.
예를 들어, buy_history_1 테이블의 mem_id는 group_singer 테이블의 mem_id와 연결되어 있어, buy_history_1의 mem_id 값은 반드시 group_singer에 존재하는 값이어야 합니다.
요약:
- ADD CONSTRAINT mem_id_fk2: 제약 조건의 이름을 설정.
- FOREIGN KEY(mem_id): mem_id 열이 외래 키임을 정의.
- REFERENCES group_singer(mem_id): 외래 키가 참조하는 테이블과 열을 정의.
1:1 관계일 때 외래키 필드설정을 어디에 넣어야할지 고민될 때
둘중에 좀 더 을인 테이블에게 외래키를 줘야한다고함
양쪽에 FK를 주는게 아니라 왜 한쪽에 줄까?
두개를 주면 안되는 이유, 두개를 주는거는 상호참조라고 이야기하는데
테이블에서는 RDB에서는 상호참조를 허용하지않는다
되긴 되는데..안하는 거를 적극 권장함.
'PROGRAMMING > 슈퍼코딩 강의 정리' 카테고리의 다른 글
가이드 4강 HTTP 쿠키&섹션과 JWT (0) | 2024.10.09 |
---|---|
86강 HTTP 와 REST API 알아보기 (0) | 2024.10.09 |
78-1강 MySQL 제약조건 익히기 (0) | 2024.10.02 |
77강 SQL문 JOIN 익히기 (2) | 2024.10.02 |
슈퍼코딩 105강 Spring boot와 테스팅v2 (0) | 2024.09.28 |