아버지는 유일성을 보장 받았기 때문에 참조키 가능
CREATE TABLE test1(
code VARCHAR2(30) PRIMARY KEY,
subject VARCHAR2(50) NOT NULL
);
CREATE TABLE ex1 (
id VARCHAR2(30) PRIMARY KEY,
name VARCHAR2(30) NOT NULL,
code VARCHAR2(30),
CONSTRAINT fx_ex1_code FOREIGN KEY(code) REFERENCES test1(code)
);
INSERT INTO ex1(id, name, code) VALUES (1, 'a', 'x100');
-- ORA-02291: 무결성 제약조건(SKY.FX_EX1_CODE)이 위배되었습니다- 부모 키가 없습니다
-- 부모테이블에 존재하지 않는 code는 추가 불가
INSERT INTO ex1(id, name, code) VALUES (1, 'a', NULL);
-- 참조키가 null을 허용 했으므로 가능
-- 부모부터 data를 넣어야 자식도 data를 넣을 수 있다.
-- test1(부모) 테이블에 데이터 추가
INSERT INTO test1(code, subject) VALUES('x100', 'aaa');
INSERT INTO test1(code, subject) VALUES('x101', 'bbb');
INSERT INTO test1(code, subject) VALUES('x102', 'ccc');
INSERT INTO ex1(id, name, code) VALUES ('2', 'b', 'x100');
INSERT INTO ex1(id, name, code) VALUES ('3', 'c', 'x102');
INSERT INTO ex1(id, name, code) VALUES ('4', 'd', 'x100');
-- 참조하는 컬럼과 참조당하는 컬럼은 타입은 일치해야 하지만 컬럼명은 다를 수 있다.
CREATE TABLE test2 (
num NUMBER PRIMARY KEY,
subject VARCHAR2(50) NOT NULL
);
CREATE TABLE exam2(
id VARCHAR2(30) PRIMARY KEY,
name VARCHAR2(30) NOT NULL,
snum NUMBER NOT NULL,
CONSTRAINT fk_ex2_snum FOREIGN KEY(snum) REFERENCES test2(num)
);
SELECT * FROM user_constraints WHERE table_name = 'TEST2';
SELECT * FROM user_constraints WHERE table_name = 'EXAM2';
SELECT * FROM user_cons_columns WHERE table_name = 'TEST2';
SELECT * FROM user_cons_columns WHERE table_name = 'EXAM2';
DROP TABLE exam2 PURGE;
DROP TABLE test2 PURGE;


CREATE TABLE member2(
id VARCHAR2(50),
birth DATE,
tel VARCHAR2(30),
CONSTRAINT pk_member2_id PRIMARY KEY(id),
CONSTRAINT fk_member2_id FOREIGN KEY(id)
REFERENCES member1(id)
);
CREATE TABLE guest(
num NUMBER PRIMARY KEY,
id VARCHAR2(50) NOT NULL,
content VARCHAR2(4000) NOT NULL,
reg_date DATE DEFAULT SYSDATE,
FOREIGN KEY (id) REFERENCES member1(id)
);
CREATE TABLE note(
num NUMBER PRIMARY KEY,
content VARCHAR2(4000) NOT NULL,
sendld VARCHAR2(50) NOT NULL,
receiveld VARCHAR2(50) NOT NULL,
FOREIGN KEY(sendld) REFERENCES member1(id),
FOREIGN KEY(receiveld) REFERENCES member1(id)
); -- member1을 2번 참조 이름은 같을 필요가 없다.
-- member1 테이블의 모든 자식 테이블의 목록 출력
SELECT fk.owner, fk.constraint_name , fk.table_name
FROM all_constraints fk, all_constraints pk
WHERE fk.r_constraint_name = pk.constraint_name
AND fk.constraint_type = 'R'
AND pk.table_name = UPPER('member1')
ORDER BY fk.table_name;
-- guestLIKE테이블의 모든 부모 테이블 및 부모 컬럼 출력
SELECT fk.constraint_name, fk.table_name child_table, fc.column_name child_column,
pk.table_name parent_table, pc.column_name parent_column
FROM all_constraints fk, all_constraints pk, all_cons_columns fc, all_cons_columns pc
WHERE fk.r_constraint_name = pk.constraint_name
AND fk.constraint_name = fc.constraint_name
AND pk.constraint_name = pc.constraint_name
AND fk.constraint_type = 'R'
AND pk.constraint_type = 'P'
AND fk.table_name = UPPER('gusetLike');
CREATE TABLE guestLike(
num NUMBER,
id VARCHAR2(50),
PRIMARY KEY(num, id),
FOREIGN KEY (num) REFERENCES guest(num),
FOREIGN KEY (id) REFERENCES member1(id)
);
-- 중복으로 사용할 수 있냐 없냐 .
ALTER TABLE table_name
ADD [ CONSTRAINT constraint_name ] FOREIGN KEY (column [, column ]...)
REFERENCES [ schema. ] object [ (column [, column ]...) ]
[ON DELETE { CASCADE | SET NULL } ];
CREATE TABLE test1(
code VARCHAR2(30) NOT NULL,
num NUMBER NOT NULL,
subject VARCHAR2(100) NOT NULL,
PRIMARY KEY (code, num)
);
CREATE TABLE test2 (
pnum NUMBER PRIMARY KEY,
name VARCHAR2(500) NOT NULL,
code VARCHAR2(30) NOT NULL,
num NUMBER NOT NULL
);
ALTER TABLE test2 ADD FOREIGN KEY (code, num) REFERENCES test1(code, num);
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
SELECT * FROM user_constraints WHERE table_name = 'TEST2';
SELECT * FROM user_cons_columns WHERE table_name = 'TEST2';
-- 제약 조건을 확인하여 CONSTRAINT_TYPE에서 참조키를 찾는다.
ALTER TABLE test2 DROP CONSTRAINT SYS_C008571;
제약조건 확인

제약조건 확인 후 삭제

대분류, 중분류 할때 사용