본문 바로가기
멀티캠퍼스/DB

230822 (화)

by 세크레투스 2023. 8. 22.
반응형
SMALL

<중복되지 않는 값 UNIQUE>

1. UNIQUE(Key역할, 주요 검색대상)

- 열에 저장할 데이터의 중복을 허용하지 않고자 할 때 사용

- NULL은 값이 존재하지 않음을 의미하기 때문에 중복 대상에서 제외

- 자동으로 INDEX가 생성됨 (검색 속도를 높이기 위해서 운영함)

* index : 생성된 순서대로 정렬하는 것, key 값은 index가 자동으로 생성됨. 단어가 정렬되어 있음.

- 검색 속도를 높이기 위해서는 : 정렬을 해야 함.

- UNIQUE는 여러 열(컬럼) 지정 가능

 

2. 테이블을 생성하며 제약조건 지정

- 제약 조건 지정하기(테이블 생성할 때)

Create table table_unique(

LOGIN_ID varchar(20) UNIQUE,

LOGIN_PWD varchar(20) NOT NULL,

TEL varchar(20)

);

 

3. 제약 조건 확인

- USER_CONSTANTS 데이터 사전 뷰로 제약 조건 확인하기

SELECT OWNER, CONSTANT_NAME, CONSTANT_TYPE, TABLE_NAME

FROM USER_CONSTRAINTS

WHERE TABLE_NAME = 'TABLE_UNIQUE';

 

- TABLE_UNIQUE 테이블에 데이터 입력하기

INSERT INTO TABLE_UNIQUE(LOGIN_ID, LOGIN_PWD, TEL) VALUES('TEST_ID_01', 'PWD01', '010-1234-5678');

INSERT INTO TABLE_UNIQUE(LOGIN_ID, LOGIN_PWD, TEL) VALUES('TEST_ID_02', 'PWD01', '010-1234-5678');

//첫번째 키값(LOGIN_ID)만 Unique 속성이기 때문에 중복체크를 하고 나머지는 중복체크 하지 않는다.

 

- UNIQUE 제약 조건이 지정된 열에 NULL값 입력하기

INSERT INTO TABLE_UNIQUE(LOGIN_ID, LOGIN_PWD, TEL) VALUES(NULL, 'PWD01', '010-1234-5678');

==> UNIQUE는 NULL 허용, 게다가 NULL 값은 여러번 들어가도 허용 (중복 허용..?)

 

4. 테이블을 생성하며 제약조건 이름 직접 지정

- 테이블을 생성할 때 UNIQUE 제약 조건 설정하기

CREATE TABLE TABLE_UNIQUE2(

LOGIN_ID VARCHAR2(20) CONSTRAINT TBLUNQ2_LGNID_UNQ UNIQUE,

LOGIN_PWD VARCHAR2(20) CONSTRAINT TBLUNQ2_LGNPW_NN NOT NULL,

TEL VARCHAR2(20)

);

 

SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME

FROM USER_CONSTRAINTS

WHERE TABLE_NAME LIKE 'TABLE_UNIQUE%';

 

<유일하게 하나만 있는 PRIMARY KEY>

1. PRIMARY KEY 제약 조건

- UNIQUE와 NOT NULL 제약조건의 특성을 모두 가지는 제약 조건

- 데이터 중복을 허용하지 않고 NULL도 허용하지 않음

- 테이블에 하나 밖에 지정할 수 없음

- 자동으로 인덱스가 생성됨

- PRIMARY KEY는 모든 테이블의 필수 지정 항목이다.

- PRIMARY KEY는 주로 테이블 레벨에서 제약을 건다.

2. 테이블을 생성하며 제약조건 지정하기

- 테이블을 생성할 때 특정열에 PRIMARY KEY 설정하기

CREATE TABLE TABLE_PK(

LOGIN_ID VARCHAR2(20) PRIMARY KEY, LOGIN_PWD VARCHAR2(20) NOT NULL, TEL VARCHAR2(20)

);

- 제약조건의 이름을 직접 지정하여 테이블 생성하기

CREATE TABLE TABLE_PK2(

LOGIN_ID VARCHAR2(20) CONSTRAINT TBLPK_LOGID_PK PRIMARY KEY,

LOGIN_PWD VARCHAR2(20) NOT NULL,

TEL VARCHAR2(20)

);

- TABLE_PK 테이블에 데이터 입력하기

INSERT INTO TABLE_PK(LOGIN_ID, LOGIN_PWD, TEL) VALUES('TEST_ID_01', 'PWD01', '010-1234-5678');

INSERT INTO TABLE_PK(LOGIN_ID, LOGIN_PWD, TEL) VALUES('TEST_ID_01', 'PWD02', '010-2345-6789');

==> 2번째 값 넣을 떄 에러남

 

- TABLE_PK 테이블에 NULL 값 입력하기

INSERT INTO TABLE_PK(LOGIN_ID, LOGIN_PWD, TEL) VALUES(NULL, 'PWD02', '010-2345-6789');

==> 에러남

 

< 다른 테이블과 관계를 맺는 FOREIGN KEY>

1. 외래키, 외부키 FOREIGN KEY

- 서로 다른 테이블 간 관계를 정의

- 특정 테이블에서 PRIMARY KEY 제약 조건을 지정한 열을 다른 테이블의 특정 열에서 참조하겠다는 의미로 지정

SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, R_OWNER, R_CONSTRAINT_NAME

FROM USER_CONSTRAINTS

WHERE TABLE_NAME IN ('EMP', 'DEPT');

EMP 테이블의 FOREIGN KEY 는 DEPT 테이블의 DEPTNO 이다.

EMP PK EMPNO

DEPT PK DEPTNO

 

INSERT INTO EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) VALUES(9999, '홍길동', 'CLERK', '7788', TO_DATE('2017/04/30', 'YYYY/MM/DD'), 1200, NULL, 50);

 

- foreign key는 주로 테이블레벨에 제약을 건다.

- 그럴려면 참조대상이 필요한데, 이 참조대상을 바로 부모테이블이라고 부른다.

 

2. FOREIGN KEY 지정하기

- DEPT_FK 테이블 생성하기

CREATE TABLE DEPT_FK(

DEPTNO NUMBER(2) CONSTRAINT DEPTFK_DEPTNO_PK PRIMARY KEY,

DNAME VARCHAR(14),

LOC VARCHAR(13)

);

 

- EMP_FK 테이블 생성하기 (자식테이블)

CREATE TABLE EMP_FK (

EMPNO NUMBER(4) CONSTRAINT EMPFK_EMPNO_PK PRIMARY KEY, <= 칼럼 레벨

ENAME VARCHAR2(10),

JOB VARCHAR2(9),

MGR NUMBER(4),

HIREDATE DATE,

SAL NUMBER(7, 2),

COMM NUMBER(7, 2),

DEPTNO NUMBER(2) CONSTRAINT EMPFK_DEPTNO_FK REFERENCES DEPT_FK(DEPTNO) <= 테이블 레벨

);

 

- FOREIGN KEY 지정할 떄 유의점

* DEPT_FK 테이블에 데이터가 아직 없는 상태에서

* EMP_FK 테이블에 데이터를 추가하면 에러 -> DEPTNO 없음

* 그래서 항상 부모테이블에 먼저 데이터를 넣어주고 난 뒤에 자식테이블에 데이터를 넣어줘야 함.

 

- DEPT_FK에 데이터 삽입하기

INSERT INTO DEPT_FK

VALUES(10, 'TEST_NAME', 'TEST_LOC');

- EMP_FK 테이블에 데이터 삽입

INSERT INTO EMP_FK

VALUES(9999, 'TEST_NAME', 'TEST_JOB', NULL,

TO_DATE('2001/01/01','YYYY/MM/DD'), 3000, NULL, 10);

 

3. FOREIGN KEY로 참조 데이터 행 데이터 삭제하기

- DEPT_FK의 행을 삭제 시 : EMP_FK에서 해당 행을 참조하고 있다면 삭제 실패

- DEPT_FK 테이블의 10번 부서 데이터 삭제하기

DELETE FROM DEPT_FK

WHERE DEPTNO = 10;

- 열 데이터를 삭제할 때 이 데이터를 참고하고 있는 데이터도 함께 삭제

- 부모테이블을 삭제할 때 나는 거기에 참조된 테이블도 함께 삭제하겠다. 라는 조건을 걸어줄 수 있음.

* 주로 게시판, 댓글 관계에서 이런 제약조건을 잘 이용하는 편임.

CONSTRAINT [제약조건 이름]

REFERENCE 참조테이블(참조열) ON DELETE CASECADE

 

* 인사부서에서 구성원이 퇴사하거나 인사이동을 할때 삭제할때는 주로 이런 제약조건을 거는 편.

CONSTRAINT [제약조건 이름] FOREIGN KEY(칼럼명)

REFERENCE 참조테이블(참조열) ON DELETE SET NULL

 

* 요즘은 보안문제때문에 필수적으로 회원제 서비스 정책이 있어야 함. (예를 들어서 해당 회사 사이트 아이디를 사용하지 않은지 1년 이상이 되면 자동으로 해당 데이터를 삭제해준다던지..)

 

<자바 CLI Application>

- 시그니처의 역할 : 식별하기 위한 용도

- 공통점은? : 리턴타입(void)과 매개변수가 동일한 모양, 물론 메서드명은 다름.

==> 동일한 형태의 시그니처를 만들어줄 수 있다. = 한가지 형태로 운형할 수 있다.

1. 추상화

- 메뉴의 항목과 그때 실행할 메서드 = Command 인터페이스를 만듦

=> 이때 중요한 것은 return 타입과 매개변수

public interface Command {

void execute(); // void = 리턴타입, execute = 매개변수 호출방법이 1가지로 통일

}

- 뭐가 주입될지는 인스턴스에 의해서 결정됨.

public MenuItem ( 인스턴스 ) { ... } <- MenuItem의 생성자

 

2. 오늘 할 것

- 메뉴 목록 관리

* 개수에 상관없이 여러개를 관리하려면? : List를 사용해서 관리.

** 제너릭은 뭐가 될까? MenuItem

** List의 구현체는 : ArrayList 또는 LinkedList -> 일반적으로 ArrayList를 사용함.

 

<보충 설명>

1. 기존의 Application.java에서 if~else if~ else if~ else 파트를 변경할때 사용한 패턴이 Command 패턴이다.

이것을 MenuItem.java의 요소로 삼았고, 실행시킬 수 있었다.

 

2. Application의 기본 동작을 부모클래스에서 잡아줬다(알고리즘을 정해놨다).

(Application의 run() 메소드)

우리는 item.execute() <- 뭘 실행할지만 정하면 된다.

어디에서? createMenu()메서드에서

=> 이것을 Template 메서드 패턴이라고 한다.

 

3. 내가 수정해야 할 부분 :

createMenu() 메서드 -> @Override를 통해서 변경해줌

=> 이것을 CLI Application Framework 라고 부른다.

 

4. Framework = 틀, 정해진 동작

- 운영방법을 변경할 수 없으며, 내가 정해진 위치에서 동작하는 것이다.

부모 클래스에서 가져다가 필요한 부분만 수정해주면 된다.

==> 개발 속도가 빨라진다.

동작의 주체 : Framework에 있다.

우리가 프레임워크에 맞춰서 개발한다.

 

반응형
LIST

'멀티캠퍼스 > DB' 카테고리의 다른 글

20230824 (목)  (0) 2023.08.24
20230823 (수)  (0) 2023.08.23
20230821(월)  (0) 2023.08.21
20230818 (금)  (0) 2023.08.18