샘플 스키마 : HR 설명하는 과정에서 예제로 주어진 문장은 눈으로 보지만 말고 직접 실행시켜 보길 권한다. PK(Primary Key)와 FK(Foreign Key)는 테이블의 필수 요소로써 모든 테이블은 이들 둘 중 하나 이상을 반드시 포함하고 있다. Primary Key 설정 CREATE TABLE 테이블( … CONSTRAINT 제약_조건_이름 PRIMARY KEY (컬럼) ); CREATE TABLE 테이블( 컬럼 데이터타입 CONSTRAINT 제약_조건_이름 PRIMARY KEY, …
◈ 예제 create table dept( dno varchar2(14), dname varchar2(14), loc varchar2(8), director varchar2(4), constraint dept_dno_pk primary key (dno) ); 또는 create table dept( dno varchar2(2) constraint dept_dno_pk primary key, dname varchar2(14), loc varchar2(8), director varchar2(4) ); Table DEPT이(가) 생성되었습니다. Foreign Key 설정 CREATE TABLE 테이블( … CONSTRAINT 제약_조건_이름 FOREIGN KEY (컬럼) REFERENCES 참조할_테이블 (참조할_컬럼) [ON DELETE CASCADE | ON DELETE SET NULL] ); CREATE TABLE 테이블( 컬럼 데이터타입 CONSTRAINT 제약_조건_이름 FOREIGN KEY REFERENCES 참조할_테이블 (참조할_컬럼) [ON DELETE CASCADE | ON DELETE SET NULL] …
insert into countries values ('KR', 'Korea', 3); 1 행 이(가) 삽입되었습니다. insert into countries values ('NK', 'North Korea', 5); 오류 보고 - ORA-02291: integrity constraint (HR.COUNTR_REG_FK) violated - parent key not found COUNTRIES 테이블의 REGION_ID 컬럼은 REGIONS 테이블의 REGION_ID 컬럼을 참조한다. 즉, REGIONS 테이블이 부모 테이블이고 COUNTRIES 테이블이 자식 테이블이다. 자식 테이블에 데이터를 삽입할 때 부모 테이블의 참조하는 컬럼에 없는 값을 삽입하면 위와 같이 오류가 발생한다. TIP 일반적으로 데이터베이스를 설계할 때 자식 테이블의 FK 컬럼은 부모 테이블의 참조하는 컬럼과 같은 이름을 사용한다. 다른 이름을 사용해도 무관하지만, 되도록이면 같은 이름을 사용하는 것이 테이블 간의 관계를 한 번에 알아볼 수 있기 때문에 좋다. ◈ 예제 create table emp( eno varchar2(4), ename varchar2(10), job varchar2(6), mgr varchar2(4), hdate date, sal number, dno varchar2(2), constraint emo_eno_pk primary key (eno), constraint emp_eno_fk foreign key (dno) references dept (dno) ); 또는 create table emp( eno varchar2(4) constraint emp_eno_pk primary key, ename varchar2(10), job varchar2(6), mgr varchar2(4), hdate date, sal number, dno varchar2(2) constraint emp_dno_fk references dept (dno) ); Table EMP이(가) 생성되었습니다. 컬럼 레벨로 정의할 때는 foreign key를 생략해도 무관하다. drop table dept cascade constraint; Table DEPT이(가) 삭제되었습니다. drop table emp cascade constraint; Table EMP이(가) 삭제되었습니다. 테이블 생성
예제 create table employees( employee_id number(6), first_name varchar2(20), last_name varchar2(25) constraint emp_last_name_nn not null, email varchar2(25) constraint emp_email_nn not null, phone_number varchar2(20), hire_date date constraint emp_hire_date_nn not null, job_id varchar2(10) emp_job_nn not null, salary number(8, 2) commission_pct number(2, 2), manager_id number(6), department_id number(4), constraint emp_employee_id primary key (employee_id), constraint emp_email_uk unique (email), constraint emp_salary_ck check (salary > 0), constraint emp_dept_fk foreign key (department_id) references departments (department_id) ); 우리가 사용하고 있는 HR 스키마의 EMPLOYEES 테이블은 위와 같은 문장으로 생성되었다. 오라클에서만 해당되는 내용이다. DB 종류마다 다르므로 오라클을 사용할 경우만 참고 하자. 제약 조건 조회 SELECT c.table_name, c.constraint_name, c.constraint_type, s.column_name FROM user_constraints c, user_cons_columns s WHERE c.constraint_name = s.constraint_name AND c.table_name in (검색_대상_테이블_목록) ORDER BY c.table_name;
◈ 예제 select c.table_name, c.constraint_name, c.constraint_type, s.column_name from user_constraints c, user_cons_columns s where c.constraint_name = s.constraint_name and c.table_name in ('EMPLOYEES', 'DEPARTMENTS') order by c.table_name; 참조하는 테이블 목록 조회 SELECT p.table_name 부모테이블, p.constraint_name 부모제약조건, c.table_name 자식테이블, c.constraint_name 참조제약조건 FROM user_constraints p, user_constraints c WHERE c.r_constraint_name = p.constraint_name AND p.table_name in (검색_대상_테이블_목록) ORDER BY p.table_name;
◈ 예제 select p.table_name 부모테이블, p.constraint_name 부모제약조건, c.table_name 자식테이블, c.constraint_name 참조제약조건 from user_constraints p, user_constraints c where c.r_constraint_name = p.constraint_name and p.table_name in ('EMPLOYEES', 'DEPARTMENTS', 'LOCATIONS') order by p.table_name; CHECK와 NOT NULL 제약 조건 검색 SELECT constraint_name, search_condition FROM user_constraints WHERE table_name = '테이블';
◈ 예제 select constraint_name, search_condition from user_constraints where table_name = 'EMPLOYEES';
|