공장(Factory) 테이블 제약조건 실습하기
| 다음 구조를 갖는 테이블을 생성 한다. 각 테이블에는 필요한 PK와 FK를 지정 한다 - 데이터 타입이나 길이는 임의로 각자 결정하고 테이블 생성 순서에 주의 한다 factory 테이블(공장) : fno(공장번호), fname(공장이름), loc(지역) goods 테이블(제품) : gno(제품번호), gname(제품명), pri(표준단가), fac_no(생산공장) prod 테이블(출고 상품) : s_num(일련번호), gno(제품번호), pri (출고단가), pdate(생산일자) |

1. 삭제 단계: 자식(prod)부터 지워야 부모(factory)를 지울 수 있다 (연결고리 때문)
DROP TABLE prod;
DROP TABLE goods;
DROP TABLE factory;
PURGE RECYCLEBIN; ---+ 지워진 테이블을 휴지통에서 완전히 삭제해 공간을 비운다
2. 공장(부모) 생성
CREATE TABLE factory (
fno VARCHAR2(8), --- 번호에 문자가 섞일 수 있도록 유연하게 설정
fname VARCHAR2(50),
loc VARCHAR2(100),
CONSTRAINT factory_pk_fno PRIMARY KEY (fno) --- 이 테이블의 주인공은 fno이며, 절대 중복될 수 없다
);
3. 제품(자식) 생성
CREATE TABLE goods (
gno VARCHAR2(8),
gname VARCHAR2(50),
pri NUMBER(10,2), -- 소수점 2자리까지 단가를 정확히 표현 (예: 100.50원)
fac_no VARCHAR2(8),
-- [제약2] 이 테이블의 주인공은 gno입니다.
CONSTRAINT goods_pk_gno PRIMARY KEY (gno), ---> 이 테이블의 주인공은 gno 이다
fac_no는 반드시 위 factory 테이블의 fno에 있는 번호여야만 합니다.
CONSTRAINT goods_fk_fac_no FOREIGN KEY (fac_no) REFERENCES factory (fno) ---> fac_no(생산공장)는 반드시 위 factory 테이블의 fno에 있는 번호여야 한다
);
기본키 (PRIMARY KEY) 쪼개기
CONSTRAINT factory_pk_fno PRIMARY KEY (fno)
| 구성 요소 | 명칭 | 기능 및 의미 |
| CONSTRAINT | 키워드 (Keyword) | 제약 조건을 정의하겠다는 선언 |
| factory_pk_fno | 제약 조건 명 (Name) | 이 규칙에 부여하는 고유 이름. 관리 및 에러 확인 시 사용 |
| PRIMARY KEY | 제약 유형 (Type) | 중복 불가능(Unique)과 빈칸 불가능(Not Null)을 동시에 적용하는 규칙 |
| (fno) | 대상 컬럼 (Column) | 위 규칙을 적용할 특정 열(Column)을 지정 |
기본키 (PRIMARY KEY) 쪼개기
CONSTRAINT goods_pk_gno PRIMARY KEY (gno)
| 구성 요소 | 명칭 | 기능 및 의미 |
| CONSTRAINT | 키워드 | 제약 조건을 정의하겠다는 선언 |
| goods_pk_gno | 제약 조건 명 | 이 규칙의 이름(테이블명_종류_컬럼명) |
| PRIMARY KEY | 제약 유형 | gno(제품번호)를 이 테이블의 유일한 식별자로 지정 |
| (gno) | 대상 컬럼 | 규칙을 적용할 대상 칸. 중복값과 빈칸을 허용하지 않음 |
4. 출고(손자) 생성
CREATE TABLE prod (
s_num VARCHAR2(16), --- 긴 형태의 일련번호를 담을 수 있게 길게 설정
gno VARCHAR2(8),
pri NUMBER(10,2),
hdate DATE, -- 생산/출고 날짜 타입
CONSTRAINT prod_pk_snum PRIMARY KEY (s_num), ---> 출고 건 마다 붙는 유일한 일련번호 이다
CONSTRAINT prod_fk_gno FOREIGN KEY (gno) REFERENCES goods (gno) ---> gno(제품번호)는 반드시 위 goods 테이블의 gno에 등록된 제품이어야 한다
);
기본키 (PRIMARY KEY) 쪼개기
CONSTRAINT prod_pk_snum PRIMARY KEY (s_num)
| 구성 요소 | 명칭 | 기능 및 의미 |
| CONSTRAINT | 키워드 | 제약 조건을 정의하겠다는 선언 |
| prod_pk_snum | 제약 조건 명 | 이 규칙의 이름 (prod 테이블의 PK인 s_num) |
| PRIMARY KEY | 제약 유형 | s_num(일련번호)을 이 테이블의 유일한 식별자로 지정 |
| (s_num) | 대상 컬럼 | 출고될 때마다 붙는 번호로, 중복되거나 비어있을 수 없음 |
외래키 (FOREIGN KEY) 쪼개기
CONSTRAINT prod_fk_gno FOREIGN KEY (gno) REFERENCES goods (gno)
| 구성 요소 | 명칭 | 기능 및 의미 |
| CONSTRAINT | 키워드 | 제약 조건을 정의하겠다는 선언 |
| prod_fk_gno | 제약 조건 명 | 이 규칙의 이름(prod 테이블의 FK인 gno) |
| FOREIGN KEY (gno) | 제약 유형 및 컬럼 | gno(제품번호) 칸을 부모 테이블과 연결하는 통로로 설정 |
| REFERENCES | 참조 선언 | 어디에 있는 정보를 확인할지 지정하는 키워드 |
| goods (gno) | 참조 대상 | goods 테이블의 gno에 실제로 등록된 제품만 팔 수 있게 확인 |