<중복되지 않는 값 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에 있다.
우리가 프레임워크에 맞춰서 개발한다.
'멀티캠퍼스 > DB' 카테고리의 다른 글
20230824 (목) (0) | 2023.08.24 |
---|---|
20230823 (수) (0) | 2023.08.23 |
20230821(월) (0) | 2023.08.21 |
20230818 (금) (0) | 2023.08.18 |