프로그래밍 정리/Oracle

Oracle 기본정리 - 외래키, 제약조건

Wooni0477 2019. 12. 4. 13:07
반응형

Oracle 기본정리 - 외래키, 제약조건

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
--예제1-외래키 만드는 방법1-------------------------------------------------------------
--테이블생성
create table dept01
(
    deptno number(3),
    dname varchar2(20),
    loc varchar2(20),
    constraint dept01_deptno_pk primary key(deptno) --제약조건이름은 'sys_**' 로 자동생성
);
 
create table emp01
(
    empno number(3primary key
    , ename varchar2(20)
    , deptno number(3references dept01(deptno)
);
 
--constraint 제약조건, 해당 테이블 조회
select * from user_constraints
where upper(table_name) in(upper('emp01'),upper('dept01'));
 
--테이블 완전삭제
drop table emp01 purge;
 
 
--예제2-외래키 만드는방법 2--------------------------------------------------------------------
--테이블 생성
create table emp01
(
    empno number(3constraint emp01_empno_pk primary key
    , ename varchar2(20)
    , deptno number(3)constraint emp01_deptno_fk references dept01(deptno) --제약조건 이름 정할수 있음
);
 
----constraint 해당 테이블 조회
select * from user_constraints
where upper(table_name) in(upper('emp01'),upper('dept01'));
 
desc dept01;
 
insert into dept01 values(10,'a','a');
insert into dept01 values(20,'b','b');
 
insert into emp01 values(1,'hong',10);
insert into emp01 values(2,'kim',null);
insert into emp01 values(3,'park',40);
 
--테이블 완전삭제
drop table emp01 purge;
 
 
--예제3--외래키 만드는 방법3---------------------------------------------------
--테이블생성
create table emp01
(
    empno number(3)
    , ename varchar2(20)
    , deptno number(3)
    ,constraint emp01_empno_pk primary key(empno)
    ,constraint emp01_deptno_fk foreign key(deptno) references dept01(deptno) --제약조건이름을 지정가능, 맨뒤로 빼내서 따로 지정가능
);
 
--constraint 제약조건, 해당 테이블 조회
select * from user_constraints
where upper(table_name) in(upper('emp01'),upper('dept01'));
 
-----------------------------------------------------
--예제4
create table student
(
    iphakyear number(5not null
    ,dept number(2not null
    ,no number(2not null
    ,name varchar2(10)
    ,addr varchar(10)
    ,constraint student_ip_dept_no primary key(iphakyear,dept,no)
);
 
create table jumsu
(
    no number(3constraint jumsu_no_pk primary key
    , subject varchar2(20)
    , y       number(4)
    , d       number(4)
    , n       number(2)
    , constraint jumsu_y_d_n_fk foreign key(y,d,n) references student(iphakyear,dept,no)
);
 
--constraint 제약조건, 해당 테이블 조회
select * from user_constraints
where upper(table_name) in(upper('student'),upper('jumsu'));
 
 
------------------------------------------------------------------------------------------------------------------------
--문제1-테이블 만들어보기
/*
name : user_emp
emp_id primary key 1, 2, 3
name
email
manager_id foreign key => 1,2,3 null
job_id foreign key a b c null
name : user_job
 job_id primary key
 job_title
*/
 
--문제1(답)
CREATE TABLE user_emp
(
    emp_id number(2constraint user_emp_emp_id_pk primary key
    , name varchar2(10)
    , email varchar2(10)
    , manager_id number(2constraint user_emp_manager_id_fk REFERENCES user_emp(emp_id)
    , job_id varchar2(3constraint user_emp_job_id_fk references user_job(job_id)
);
 
create table user_job
(
    job_id varchar2(3constraint user_job_job_id_pk primary key
    , job_title varchar2(10)
);
 
--constraint 제약조건, 해당 테이블 조회
select * from user_constraints
where upper(table_name) in(upper('user_emp'),upper('user_job'));
 
--테이블 값 입력
insert into user_job values('a','a');
insert into user_job values('b','b');
insert into user_emp values(1,'hong','aa@aa.com',null,'a');
insert into user_emp values(2,'park','aa2@aa.com',null,'a');
 
--자식튜플 삭제가능
delete from user_emp
where emp_id=2;
 
--부모튜플 삭제 불가능
delete from user_job
where job_id='a';
 
--제약조건 삭제
alter table user_job
drop constraint user_job_job_id_pk cascade-- cascade는 user_job의 job_id와 연계된 모든 제약 삭제
 
desc user_emp;
desc user_job;
 
--제약조건 2개 다시 생성
alter table user_job
 add constraint user_job_job_id_pk primary key(job_id);
 
alter table user_job
 add constraint user_emp_job_id_fk foreign key(job_id) references user_job(job_id);-- on delete cascade;
                                                                                   --cascade 제약조건을 붙일수 있음
 
--제약조건 삭제
alter table user_job
drop constraint USER_EMP_JOB_ID_FK;
 
update user_job
set job_id='t'
where job_id='a';
 
--정책이 있을경우 삭제가 안됨
delete from user_job
where job_id='a';
 
select * from user_job;
 
cs
반응형