일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- VUE
- 스프링
- 국비IT
- 코딩테스트
- 자바스크립트
- php
- react
- 자바스크립트 코딩테스트
- 오라클
- 리액트네이티브
- typescript
- ReactNative
- Java의정석
- 정보처리기사정리
- 이안의평일코딩
- 정보처리기사실기정리
- 리액트
- 정보처리기사실기
- 정보처리기사
- Oracle
- 자스코테
- 평일코딩
- 정보처리기사실기요약
- CSS
- javascript
- 타입스크립트
- spring
- 자바의정석
- 정보처리기사요약
- 국비코딩
- Today
- Total
이안의 평일코딩
Oracle 10일차 - 제약조건(CONSTRAINT) 본문
2020.08.18(화)
* 복습
DML (데이터 조작언어)
= SELECT
=> 형식)
SELECT * | column1, column2...
FROM table_name
[
WHERE 조건문
GROUP BY 그룹컬럼
HAVING 그룹조건
ORDER BY 컬럼명 ASC|DESC
]
===================================
= INSERT (데이터 추가)
=> 형식)
1) INSERT INTO table_name VALUES(전체 데이터가 첨부)
=> 전체 데이터 추가
2) INSERT INTO table_name(컬럼명, 컬럼명...)
VALUES(값, 값...)
=> 필요한 데이터만 추가
= UPDATE (데이터 수정)
UPDATE table_name SET
WHERE 조건문
= DELETE (데이터 삭제)
DELETE FROM table_name
WHERE 조건문
========================== 반드시 COMMIT을 사용
*** 자바에서 DML은 AutoCommit
테이블 생성
1) 기존의 테이블 복사 (CATS)
형식)
CREATE TABLE table_name
AS SELECT ~~
2) 새롭게 생성
형식)
CREATE TABLE table_name(
컬럼명 데이터형 [제약조건(여러개 사용이 가능)],
컬럼명 데이터형 [제약조건(여러개 사용이 가능)],
컬럼명 데이터형 [제약조건(여러개 사용이 가능)]
[제약조건..],
[제약조건..]
);
= 컬럼명 뒤에 첨부 (컬럼레벨) => NOT NULL, DEFAULT
=> 테이블과 동시에 생성
= 나중에 첨부 (테이블레벨) (권장)
=> 테이블 생성후에 나중에 생성
1) 테이블 생성 반드시 필요한 요소
= 데이터형
= 제약조건의 종류
= 같은 데이터베이스(XE)에서는 테이블은 유일값이다
= 시작은 문자(영문, 한글)로 시작
= 숫자를 사용이 가능 (앞에 사용금지)
= 테이블명은 30byte(한글 15자)
*** 영문으로 사용시 테이블명은 대문자로 저장
= 특수문자 단어가 두 개 이상일 경우에 주로 (_)
= 키워드는 사용할 수 없다
1. 데이터형
문자저장 ====> 자바(String으로 매칭)
CHAR(1~2000byte) : 고정바이트
=> 글자수가 동일할 때 주로 설정
성별 (남자, 여자)
sex CHAR(4) : 한글 2byte사용
VARCHAR2(1~4000byte) : 가변바이트
=> 일반적으로 사용하는 문자저장
name VARCHAR2(34)
CLOB(4G) : 가변바이트
=> 줄거리, 내용...
story CLOB
숫자저장
NUMMBER(정수값) : 실제 정수 ==> NUMBER(4)
1~4(1~9999)
NUMBER(정수값, 정수값) : 정수, 실수
NUMBER => 자리수 14자리
날짜저장
DATE : 시스템의 시간
TIMESTAMP : DATE확장 (기록경주)
기타저장
BLOB : 동영상, 그림, 사진 => 바이너리로 저장
BFILE : 동영상, 그림, 사진 => 파일형태로 저장
2. 오라클 (데이터베이스) => 정형화된 데이터
=> 사이트에 필요한 데이터만 저장 (제약조건)
***** 제약조건
= NOT NULL => 데이터의 NULL값을 허용하지 않는다
name VARCHAR2(34) NOT NULL
값이 없으면 오라클에 저장이 안됨
= UNIQUE => 유일값 (중복이 없는 값 => NULL값 허용)
=> 후보키 (이메일, 전화번호, 주민번호)
email VARCHAR2(200) UNIQUE
= PRIMARY KEY : NOT NULL + UNIQUE
=> ID, 게시물번호, 영화번호
=> 권장 : 모든 테이블은 PRIMARY KEY를 한개 이상 가지고 있다
id VARCHAR2(20) PRIMARY KEY
= FOREIGN KEY : 외래키 => 참조 (다른 테이블의 컬럼값
=> 정규화 => 테이블을 여러개 만들기 때문에
=> emp:deptno, dpet:deptno : JOIN
deptno NUMBER(2) FOREIGN KEY
REFERENCES dept(deptno)
= CHECK : 지정된 데이터만 첨부
=> 라디오버튼, 콤보박스 사용
sex VARCHAR2(4) CHECK(sex IN('남자', '여자'));
=> 부서명, 직위
= DEFAULT : 저장값이 없는 경우에 자동으로
설정된값을 첨부
regdate DATE DEFAULT SYSDATE
연습용 테이블
emp / dept
emp
= empno : PK
= ename : NN
= job : CHECK
= mgr : empno 참조 FK
= hiredate : DATE => DEFAULT
= sal : NOT NULL
= comm
= deptno : FK
dpet
= deptno : PK
= dname : CHECK
= loc : CHECK
SQL> SELECT DISTINCT job FROM emp;
JOB
------------------
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST
SQL> SELECT dname, loc FROM dept;
DNAME LOC
---------------------------- --------------------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
OPERATIONS BOSTON
제약조건 NOT NULL => DEFAULT => PRIMARY KEY => FOREIGN => CHECK
이름 (제약조건) 부여
테이블명_컬럼명_제약조건의 약자
약자
PRIMARY KEY => PK
NOT NULL => NN
CHECK => CK
FOREIGN KEY => FK
UNIQUE => UK
CREATE TABLE dept_test(
deptno NUMBER(2),
dname VARCHAR2(20),
loc VARCHAR2(20),
CONSTRAINT dept_deptno_pk PRIMARY KEY(deptno),
CONSTRAINT dept_dname_ck CHECK(dname IN('ACCOUNTING', 'RESEARCH', 'SALES', 'OPERATIONS')),
CONSTRAINT dept_loc_ck CHECK(loc IN('NEW YORK', 'DALLAS', 'CHICAGO', 'BOSTON'))
);
CREATE TABLE emp_test(
empno NUMBER(4),
ename VARCHAR2(34) CONSTRAINT emp_ename_nn NOT NULL,
job VARCHAR2(20),
mgr NUMBER(4),
hiredate DATE DEFAULT SYSDATE,
sal NUMBER(7,2) CONSTRAINT emp_sal_nn NOT NULL,
comm NUMBER(7,2),
deptno NUMBER(2),
CONSTRAINT emp_empno_pk PRIMARY KEY(empno),
CONSTRAINT emp_mgr_fk FOREIGN KEY(mgr)
REFERENCES emp_test(empno),
CONSTRAINT emp_deptno_fk FOREIGN KEY(deptno)
REFERENCES dept_test(deptno),
CONSTRAINT emp_job_ck CHECK(job IN('CLERK', 'SALESMAN', 'PRESIDENT', 'MANAGER', 'ANALYST'))
);
DROP TABLE freeboard;
테이블 freeboard 만들기 연습
컬럼명 | no | name | subject | content | pwd | regdate | hit | |
PK/FK/NN | PK | NN | UK | NN | NN | NN | DEFAULT SYSDATE |
DEFAULT 0 |
데이터형 | NUMBER | VAR(34) | VAR(200) | VAR(4000) | CLOB | VAR(10) | DATE | NUMBER |
CONSTRAINT fb_email_uk UNIQUE(email)
* NOT NULL과 DEFAULT는 컬럼 뒤에 붙는다
DROP TABLE freeboard;
CREATE TABLE freeboard(
no NUMBER,
name VARCHAR2(34) CONSTRAINT fb_name_nn NOT NULL,
email VARCHAR2(200),
subject VARCHAR2(4000) CONSTRAINT fb_subject_nn NOT NULL,
content CLOB CONSTRAINT fb_content_nn NOT NULL,
pwd VARCHAR2(10) CONSTRAINT fb_pwd_nn NOT NULL,
regdate DATE DEFAULT SYSDATE,
hit NUMBER DEFAULT 0,
CONSTRAINT fb_no_pk PRIMARY KEY(no),
CONSTRAINT fb_email_uk UNIQUE(email)
);
INSERT INTO freeboard(no, name, email, subject, content, pwd)
VALUES(1, '홍길동', 'hong1@sist.co.kr', '오라클 제약조건', '제약조건=> 게시판', '1234');
INSERT INTO freeboard(no, name, email, subject, content, pwd)
VALUES(2, '홍길동', 'hong2@sist.co.kr', '오라클 제약조건', '제약조건=> 게시판', '1234');
INSERT INTO freeboard(no, name, email, subject, content, pwd)
VALUES(3, '홍길동', 'hong3@sist.co.kr', '오라클 제약조건', '제약조건=> 게시판', '1234');
INSERT INTO freeboard(no, name, email, subject, content, pwd)
VALUES(4, '홍길동', 'hong4@sist.co.kr', '오라클 제약조건', '제약조건=> 게시판', '1234');
INSERT INTO freeboard(no, name, email, subject, content, pwd)
VALUES(5, '홍길동', 'hong5@sist.co.kr', '오라클 제약조건', '제약조건=> 게시판', '1234');
INSERT INTO freeboard VALUES(6, '홍길동', 'hong6@sist.co.kr',
'자유 게시판만들기', '게시판 내용 설정', '1234', SYSDATE, 0);
*연습
CREATE TABLE 제품(
제품번호 VARCHAR2(12),
제품명 VARCHAR2(100),
제품단가 NUMBER CONSTRAINT 제품_단가_nn NOT NULL,
CONSTRAINT 제품_번호_pk PRIMARY KEY(제품번호),
CONSTRAINT 제품_제품명_uk UNIQUE(제품명),
CONSTRAINT 제품_단가_ck CHECK(제품단가>0)
);
CREATE TABLE 전표상세(
전표번호 VARCHAR2(12),
제품번호 VARCHAR2(12),
수량 NUMBER CONSTRAINT 전표_수량_nn NOT NULL,
단가 NUMBER CONSTRAINT 전표_단가_nn NOT NULL,
금액 NUMBER CONSTRAINT 전표_금액_nn NOT NULL,
CONSTRAINT 전표_번호_pk PRIMARY KEY(전표번호),
CONSTRAINT 전표_번호_fk FOREIGN KEY(제품번호)
REFERENCES 제품(제품번호),
CONSTRAINT 전표_총액_ck CHECK(금액>0)
);
CREATE TABLE 판매전표(
전표번호 VARCHAR2(12),
판매일자 DATE CONSTRAINT 판매_일자_nn NOT NULL,
고객명 VARCHAR2(34) CONSTRAINT 판매_고객_nn NOT NULL,
총액 NUMBER,
CONSTRAINT 판매_번호_pk PRIMARY KEY(전표번호),
CONSTRAINT 판매_번호_fk FOREIGN KEY(전표번호)
REFERENCES 전표상세(전표번호),
CONSTRAINT 판매_총액_ck CHECK(총액>0)
);
NULL값 허용 -> UNIQUE, CHECK
SQL> SELECT owner, constraint_name, constraint_type, status FROM user_constraints
2 WHERE table_name='전표상세';
OWNER CONSTRAINT_NAME CONSTRAINT_TYPE STATUS
HR 전표_수량_NN C ENABLED
HR 전표_단가_NN C ENABLED
HR 전표_금액_NN C ENABLED
HR 전표_총액_CK C ENABLED
HR 전표_번호_PK P ENABLED
HR 전표_번호_FK R ENABLED
C => CHECK, NOT NULL
P => PRIMARY KEY
R => FOREIGN KEY
DROP TABLE 판매전표;
DROP TABLE 전표상세;
DROP TABLE 제품;
CREATE TABLE 제품(
제품번호 VARCHAR2(12),
제품명 VARCHAR2(100),
제품단가 NUMBER
);
CREATE TABLE 전표상세(
전표번호 VARCHAR2(12),
제품번호 VARCHAR2(12),
수량 NUMBER,
단가 NUMBER,
금액 NUMBER
);
CREATE TABLE 판매전표(
전표번호 VARCHAR2(12),
판매일자 DATE,
고객명 VARCHAR2(34),
총액 NUMBER
);
-- 테이블을 생성후에 제약조건을 설정 (NN만 MODIFY고 나머지는 ADD)
ALTER TABLE 제품 MODIFY 제품단가 CONSTRAINT 제품_단가_nn NOT NULL;
ALTER TABLE 제품 ADD CONSTRAINT 제품_번호_pk PRIMARY KEY(제품번호);
ALTER TABLE 제품 ADD CONSTRAINT 제품_제품명_uk UNIQUE(제품명);
ALTER TABLE 제품 ADD CONSTRAINT 제품_단가_ck CHECK(제품단가>0);
ALTER TABLE 전표상세 ADD CONSTRAINT 전표_제품번호_fk FOREIGN KEY(제품번호)
REFERENCES 제품(제품번호);
* 제약조건
1) NOT NULL : NULL값을 허용하지 않는다 => 반드시 입력값을 추가
= 컬럼명 데이터형 NOT NULL
(권장 => 제약조건에 대해 수정, 삭제가 용이)
= 컬럼명 데이터형 CONSTRAINT 제약조건명 NOT NULL
= ALTER TABLE 테이블명 MODIFY 컬럼명 CONSTRAINT 제약조건명 NOT NULL
2) UNIQUE : 중복없는 데이터 첨부 (NULL값 허용)
= 후보키 (주민번호(X), 전화번호, 이메일)
= 컬럼명 데이터형 UNIQUE
= 컬럼명 데이터형 CONSTRAINT 제약조건명 UNIQUE(컬럼명)
테이블명_컬럼명_uk
= 컬럼명 데이터형,
CONSTRAINT 제약조건명 UNIQUE(컬럼명)
= 테이블 제작후에 제약조건 설정
ALTER TABLE 테이블명 ADD 컬럼명 CONSTRAINT 제약조건명 UNIQUE(컬럼명)
3) PRIMARY KEY : UNIQUE + NOT NULL
= 모든 테이블에 반드시 한개이상의 PRIMARY KEY가 존재
=> 이상 현상 방지 (무결성)
=> 수정, 삭제 => 원하지 않는 데이터가 적용
= 컬럼명 데이터형 PRIMARY KEY
컬럼명 데이터형 CONSTRAINT 제약조건명 PRIMARY KEY(컬럼명)
ALTER TABLE 테이블명 ADD 컬럼명 CONSTRAINT 제약조건명 PRIMARY KEY(컬럼명)
*** 컬럼 뒤에 생성 => NOT NULL, DEFAULT
*** 컬럼을 다 생성후에 테이블 마지막에 첨부 => PRIMARY, FOREIGN, CHECK, UNIQUE
CREATE TABLE 제품( 컬럼뒤에 붙여야함
제품번호 VARCHAR2(12) [제약조건], ==> NOT NULL, DEFAULT
제품명 VARCHAR2(100),
제품단가 NUMBER
[제약조건] ==> PRIMARY, FOREIGN, CHECK, UNIQUE
);
*** PRIMARY 사용하는 곳 => 일반적으로 숫자 (MAX+1, SEQUENCE(자동증가번호))
특별한 경우 (ID)
4) CHECK : 지정된 데이터만 첨부
= 장르, 성별, 부서명, 메뉴
= 입력시에 => 라디오버튼, 콤보박스
= 컬럼명 데이터형 CHECK(컬럼명 IN(10,20,30))
= 컬럼명 데이터형 CONSTRAINT 제약조건명 CHECK(컬럼명 IN(10,20,30))
= 권장사항 (이름부여 => 찾아서 수정, 삭제 가능)
5) FOREIGN KEY (참조키)
= 참조하는 테이블의 값을 벗어나면 안된다
= 게시판, 댓글
==============
게시판 댓글
번호 게시물 번호
1 3
2 3
3 3
= 컬럼명 데이터형 CONSTRAINT 제약조건명 FOREIGN KEY(컬럼명) REFERENCES 참조항 테이블명(컬럼명)
6) DEFAULT : 추가가 없는 경우에 자동으로 추가되는 값
= regdate DATE DEFUALT SYSDATE
= hit NUMBER DEFAULT 0
* select, insert, update, delete, join, subquery, view, sequence, pl/sql
'Back-end > Oracle' 카테고리의 다른 글
Oracle 15일차 - 인라인뷰 (0) | 2020.08.25 |
---|---|
Oracle 11~13일차 - 테이블 / 영화사이트 제작 (0) | 2020.08.19 |
Oracle 9일차 - DML(Data Manipulation Language) (0) | 2020.08.14 |
Oracle 8일차 - OUTER JOIN, DDL(Data Definition Language) (0) | 2020.08.13 |
Oracle 7일차 - INNER JOIN (0) | 2020.08.12 |