Spring

국비코딩 [Maria DB] 제약조건, 서브쿼리

onnnzeoz 2023. 3. 21. 17:42

제약조건

데이터의 무결성을 지키기위해 입력받은 데이터에 대한 제한을 두는 것

기본키, 외래키 등등

1. 기본키 제약조건 ( = primary key )

중복도 안되고 null값도 안됨 (pk, 기본키) like 아이디

not null 값이 꼭 있어야한다

테이블 종속적이다 -> 일부다 -> 다른 곳에 빌려줄 수 없음, 다른 곳에서 쓸 수 없음 ex 내 팔은 내 몸에 종속적임 

pk도 다른 테이블에서 못 씀, 죽으면 같이 죽음

테이블에 1개만 생성 가능

하나 이상의 컬럼으로 구성된다 (최대 16개)

unique + notnull 합친 것과 같

 

기본키 생성 방법

1. 테이블 생성시 함께 생성 (가장 자주 사용)

2. 기존테이블에 추가

 

Duplicate entry '1' for key 'PRIMARY' 오류

pk에다가 똑같은 값을 넣어놨구나! 생각해야함

 

upsert

key가 없으면 insert 있으면 update를 시킴

insert into employees (emp_no, first_name, family_name, email, mobile, salary)

values(112,'태근','김','email@naver','01020343054',99999999)

on duplicate key update first_name ='태곤', family_name='박';

 

복합키

(한 개 이상의 컬럼으로 키를 생성하는 것)

복합키에 추가되는 컬럼이 외래키일 경우 사용하지 말자, update나 insert에 제한을 줄 수 있다

create table pk_two_test(

first_col int(5),

second_col varchar(10),

third_col date,

primary key(first_col, second_col)

);

 

not null제한자

null을 허용하지 않는 것

-- not null은 키가 아니라 컬럼의 속성으로 취급한다

그래서 만들 때 add constraint로 하지 않고

ALTER TABLE [테이블명] modify column [컬럼명][데이터 타입] (사이즈) NOT NULL 이렇게 함

( Data truncated for column 'second_col' at row 1 오류 뜻: 이미 너 null 있어! )

alter table pk_test modify column second_col varchar(4) not null;

 

외래키

다른테이블에 있는 키를 가져와서 사용하는 것

PK를 제공하는 테이블이 부모, 공유받아서 외래키로 사용하는 테이블이 자식

만드는 방법

1. 만들면서 설정 : 부모먼저 만들고 자식 만들기

create table child_table(

order_id int(10)

,user_id varchar(30)

,product_name varchar(20)

,price int(10)

,qty int(5)

,foreign key(user_id) references parent_table(user_id)

);

2. 이미 만들어진 테이블에 추가 add constraint foreign key 

 

 

RDBMS에서 중요한건 상호관계

테이블 간 부모-자식 관계 설정을 할 수 있

 

부모의 PK를 그냥 가져다 쓴다 -> 비식별관계

부모의 PK를 자기가 PK로 쓴다 -> 식별관계 (=일대일 관계)

 

참조 제약 조건, fk, foerign key

다른 테이블의 pk를 참조하여(가져와서) 사용한다

 

 

연계참조 무결성 제약조건

나타난 배경 :

연계참조 무결성

연계참조 : 부모자식관계

무결성: 논리적으로 완벽하다

부모가 없는데 내가 있다? 이건 연계참조 무결성 제약조건을 위반한거임

-> 부모가 없으면 자식도 없게 하는 것

 

댓글안지우고 글먼저 지우면 부모없는 자식이 되는거니까 이게 무결성 조건 위배된거

 

근데 이거 지키기가 너무 어려워서 (부모하나 지우려면 참조한 자식들의 데이터를 다 지운다음에 지워야돼서)

나타난 개념임

 

부모를 지울 때 자식도 같이 지우고 싶다면? 

create table products(

product_id int(10) primary key

,supplier_id int(10)

,product_price int(10)

,foreign key (supplier_id) references supplier(supplier_id) on delete cascade

);

table 생성할 때 on delete cascade 붙여주기 

 

근데 이방법도 완전하진 않음 내가 댓글단글이 같이 지워지면 큰일이잖음 -> 그래서 기사같은거 걍 숨겨놓음 내리지 않아

 

UNIQUE

중복을 허용하지 않고 NOT NULL이 있을 경우 PK가 될 수 있다

null을 허용함, 테이블에 여러 개 사용할 수 있다

 

check

조건에 맞지 않으면 데이터를 받지 않는다

 

1. 제약조건에 대한 표시가 없다(조건을 알아내기도 어렵다)

알아내려면

select * from information_schema.table_constraints where TABLE_NAME = 'products';

이렇게 해야함

2. 조건이 바뀌었을 경우 제약조건을 추가해줘야한다.. (db를 계속 건드려야함)

-> 너무 까다로움 -> 자바에서 변경해줌 (근데 왜 하느냐, 이미 이렇게 만들어진 애들도 있을 수 있어서)

값을 insert하는데 자꾸 오류가 뜬다면 check 의심할 것

 

서브 쿼리

쿼리 안에 쿼리.

사전에 추출된 데이터를 재가공하거나 다른 테이블에서 추출된 내용을 가져와 쓸 때 사용한다

 

상하관계 쿼리

서브쿼리가 메인쿼리의 데이터 일부가 되는 쿼리