: 각 속성들이 가질 수 있는 값의 집합
(ex) 성별의 도메인은 남과 여, 학년의 도메인은 1학년,2학년,3학년
: 그값이 나머지 모든 행위의 값과 구별되는 속성을 가진 값
(속성) not null, 중복(duplicate) X
복합키(Composite key) : 하나의 칼럼이 후보키의 역할을 하지 못하고 두개 이상의 칼럼이 합쳐져야 후보키의 역할을 하는 경우
(ex1) 한 학생이 두개이상의 동아리에 가입할 경우 학번과 동아리이름을 합쳐서 기본키가 되어진다.
(ex2) 한 고객이 여러가지 상품을 살 수 있음 = 1:N 관계
이것이 연속되면 = N:M 관계 (이것은 개념모델링에서만 허용되며 논리,물리 모델링에선 불허한다.) 따라서 다 대 다 관계를 없애기 위해서 테이블을 하나 더 만든다.
상품 - 고객을 상품 - 주문 - 고객 테이블로 만드는것이다
위 그림에서 주문테이블의 키는 복합키일까?
부모테이블의 기본키가 자식테이블의 기본키가 되는것을 Foreign Key, 즉 외래키 라고 한다.
🚨 외래키 헷갈림주의!
그렇다면 외래키는 다 기본키인가?
: 아님! 직선으로 연결될때만그렇다.
고객번호+상품코드 = 복합키
직선은 관계를 의미하며, 관계가 존재하므로 Join연산 가능하다.
Error! 이를 정규화를 통해 해결해야 한다.
<알아둬야 할것>
- 사원은 부서를 반드시 가져야된다. 부서가 없는사원은 존재할수없다.
- 외래키는 참조 무결성 유지해야한다.
- EMP TABLE의 50번 아이디를 갖고 DEPT TABLE에서 50번인 부서 찾는데 없다? >> 그렇다면 EMP TABLE에 50을 바로 삽입하지 않는다. DEPT TABLE은 부서코드를 꼭 갖고있어야 한다. 만약 그 부서를 없앨 예정이여도 삭제하면 안되는것임!
왜 삭제가 안될까?
상품번호가 100번일때 100번상품을 많이 팔았다. 근데 a의 외상값이 있을때 그 제품코드를 실수로 날려버려 a한테 외상값을 받지 못했다. 그래서 지우지 못하게 만들었다. (참조되어지는 테이블을 말하는것임 EX.dept 테이블) 만약 삭제하고 싶다면 자식 다 삭제하고 더이상 해당되는 부모가 없을때 할수있다.
이게바로 외래키관계 때문에 발생한 참조무결성!
사원테이블이 부서테이블을 참조하고있다.
Q1. 부서테이블의 첫번째 튜플이 삭제된다면?
Q2. 부서테이블의 100번 번호가 110으로 변경된다면?
Q3. 사원테이블에 부서번호 500인 사원이 삽입된다면?
A1. 참조무결성을 위배하게된다.
A2. 사원테이블도 같이 바꿔줘야하는데 힘들다. 강제로 삭제해서 바꾸는건데 cascade옵션이나 관계를 끊는 등의 방법이 있다. (추천 X)
A3. 두 테이블의 불일치 발생
(CF)
외래키를 통해 두 테이블간의 데이터 무결성을 유지하는 것을 ‘참조 무결성 제약조건’이라고 함
오라클은 정해진 데이터 크기보다 큰자료가 들어오면 잘려서 저장이 안된다. 정해진 기억공간보다 큰 자료는 무조건 ERROR
마이바티스를 이용할때 설정부터 연동시켜주는것, xml(마크업언어를 만드는 언어)형식으로 정의되어지며 inr이라는 설정파일안에 다 저장해놓고 접속되어서 실행된다. 요즘 대부분의 프로젝트는 myBatis나 기타 프로그램 이용해서 Sql문과 개발언어를 연동하는 방법을 사용.
즉, 내장sql 사용법중 프레임워크를 이용하는게 가장 보편적
1. CREATE TABLE
테이블 생성 명령
(사용형식)
CREATE TABLE 테이블명(
컬럼명 데이터타입[(크기)] [NOT NULL] [DEFAULT 값] [,]
:
컬럼명 데이터타입[(크기)] [NOT NULL] [DEFAULT 값] [,]
[CONSTRAINT 기본키설정명 PRIMARY KEY(컬럼명[,컬럼명,...])[,]]
[CONSTRAINT 외래키설정명 FOREIGN KEY(컬럼명[,컬럼명,...])
REFERENCES 참조테이블명(컬럼명)[,]
:
[CONSTRAINT 외래키설정명 FOREIGN KEY(컬럼명[,컬럼명,...])
REFERENCES 참조테이블명(컬럼명)[,];
. 테이블명과 컬럼명은 사용자정의어를 이용하여 구성
=>첫 글자는 영문자이고 두번째 글자부터 숫자도 사용가능
특수문자는 '_'와'$'만 사용가능
예약어와같은 단어 사용할 수 없음
. '데이터타입' : CHAR,VARCHAR2,DATE,NUMBER,CLOB,BLOB,BFILE 등 사용
. '기본키설정명' : 기본키를 설정한것에 대한 인덱스로 중복된 단어를 사용 할 수 없다
. '외래키설정명' : 외래키를설정한 것에 대한 인덱스로 중복된 단어를 사용할수 없다
. '참조테이블명' : 부모테이블명
Default는 Nullable하다.
CREATE TABLE CUSTOMERS(
CUST_ID CHAR(6), --PK
CUST_NAME VARCHAR(50) NOT NULL,
CUST_ADDR VARCHAR(100),
CUST_TEL VARCHAR2(20),
CUST_MILEAGE NUMBER(5) DEFAULT 0,
CONSTRAINT pk_customers PRIMARY KEY(CUST_ID));
이거 오류남 당연함
이래야됨
최종 테이블은 이런 형식으로 되어있다.