728x90

메세지
ORA-02292: integrity constraint (KH.UF_GC_FK) violated - child record found

원인
무결점 제약조건(integrity constraint)위반 : 자식테이블이 존재해서 지울 수 없다
GRADE_CODE = 10가 부모테이블이고 얘를 참조하고 있는 자식테이블 때문에 삭제 불가

상황
FOREIGN KEY로 자식 테이블이 부모테이블을 참조했고 커밋 후 DELETE로 테이블의 데이터를 하나 삭제할려고 하다 발생한 에러

참고 코드

CREATE TABLE USER_GRADE (
    GRADE_CODE NUMBER PRIMARY KEY,
    GRADE_NAME VARCHAR2(30) NOT NULL
);

INSERT INTO USER_GRADE VALUES(10, '일반회원');
INSERT INTO USER_GRADE VALUES(20, '우수회원');
INSERT INTO USER_GRADE VALUES(30, '특별회원');


CREATE TABLE USER_FOREIGNKEY  (
    USER_NO NUMBER PRIMARY KEY,
    USER_ID VARCHAR2(20) UNIQUE,
    USER_PWD VARCHAR2(30) NOT NULL,
    USER_NAME VARCHAR2(30),
    GENDER VARCHAR2(10),
    PHONE VARCHAR2(30),
    EMAIL VARCHAR2(50),
    GRADE_CODE NUMBER,
    CONSTRAINT UF_GC_FK FOREIGN KEY(GRADE_CODE) REFERENCES USER_GRADE(GRADE_CODE)
    -- USER_GRADE(GRADE_CODE)를 참조하고 있는 (GRADE_CODE). FOREIGN KEY를 써서 이부분을 컴에게 인지시킴
);

INSERT INTO USER_FOREIGNKEY VALUES(1, 'user01', 'pass01', '강건강','남','010-1111-2222','kang@k.k',10);
INSERT INTO USER_FOREIGNKEY VALUES(2, 'user02', 'pass02', '남나눔','남','010-1111-2222','nam@k.k',10);
INSERT INTO USER_FOREIGNKEY VALUES(3, 'user03', 'pass03', '도대담','남','010-1111-2222','do@k.k',30);
INSERT INTO USER_FOREIGNKEY VALUES(4, 'user04', 'pass04', '류라라','여','010-1111-2222','ryu@k.k',NULL);
-- 참조하는 테이블(=부모테이블)의 참조 컬럼 값 외에 null 값도 가능
INSERT INTO USER_FOREIGNKEY VALUES(5, 'user05', 'pass05', '문미미','여','010-1111-2222','moon@k.k',50);
-- ERROR : ORA-02291: integrity constraint (KH.UF_GC_FK) violated - parent key not found
-- 무결점 제약조건(integrity constraint)위반 : 부모테이블에 없는 값을 참조해서 에러발생

COMMIT; -- 데이터 확정


DELETE FROM USER_GRADE -- 데이터삭제
WHERE GRADE_CODE = 10;
-- ERROR : ORA-02292: integrity constraint (KH.UF_GC_FK) violated - child record found
-- 무결점 제약조건(integrity constraint)위반 : 자식테이블이 존재해서 지울 수 없다
728x90
반응형
728x90

아래 이미지는 1번 파일을 0번 파일이 상속했다

자식 클래스 부모 클래스의 이름을 눌러보면 부모클래스와 연결되어있는 코드들의 색깔이 진해진다

이 코드들은 중복이기에 삭제하여도 부모와 자식 클래스의 정보가 연동된다

 

삭제 전

삭제 후

0번 parent 

1번 child1

2번 child2

상속관계가 0 -> 1 -> 2

1번이 0번을 상속하고 2번이 1번을 상속한 것

 

1번 child1에서 parent에 받았던 a,b부분들을 주석 처리해서 2번 child2에서 보면 정보가 그대로인 걸 알 수 있다

 

public class practice_everyday04 {
	public static void main(String[] args) {
		
		// run
		practice_everyday04_0 pe1 = new practice_everyday04_0();
		pe1.println();
		
		practice_everyday04_1 pe2 = new practice_everyday04_1();
		pe2.println();
		
		practice_everyday04_2 pe3 = new practice_everyday04_2();
		pe3.println();
		
	}	
}
public class practice_everyday04_0 {
	
	// Parent
	private int a;
	private int b;
	
	public practice_everyday04_0() {}
	public practice_everyday04_0(int a, int b) {
		this.a = a;
		this.b = b;
	}
	//getter & setter
	public int getA() {
		return a;
	}
	public void setA(int a) {
		this.a = a;	
	}
	public int getB() {
		return b;
	}
	public void setB(int b) {
		this.b = b;
	}
	
	
	public void println() {
		System.out.println("parent");
	}
	
}

 



public class practice_everyday04_1 extends practice_everyday04_0 {
		
	// child1
//	private int a;
//	private int b;
	private int c;
	
	public practice_everyday04_1() {}
	public practice_everyday04_1(int a, int b, int c) {
//		this.a = a;
//		this.b = b;
		this.c = c;
	}
	
	// getter & setter
	// setter : 데이터를 변수에 저장하는 메소드
	// getter : 저장된 데이터를 불러오는 메소드
//		public int getA() {
//			return a;
//		}
//		public void setA(int a) {
//			this.a = a;	
//		}
//		public int getB() {
//			return b;
//		}
//		public void setB(int b) {
//			this.b = b;
//		}
		public int getC() {
			return c;
		}
		public void setC(int c) {
			this.c = c;
		}
		
	@Override	
	public void println() {
		System.out.println("child1");
	}
	
}

 

// 상속 & overriding
public class practice_everyday04_2 extends practice_everyday04_1{
	
	// child2
	private int a;
	private int b;
	private int c;
	private int d;
	
	public practice_everyday04_2() {}
	public practice_everyday04_2(int a, int b, int c, int d) {
		this.a = a;
		this.b = b;
		this.c = c;
		this.d = d;
	}
	
	// getter & setter
		public int getA() {
			return a;
		}
		public void setA(int a) {
			this.a = a;	
		}
		public int getB() {
			return b;
		}
		public void setB(int b) {
			this.b = b;
		}
		public int getC() {
			return c;
		}
		public void setC(int c) {
			this.c = c;
		}
		public int getD() {
			return d;
		}
		public void setD(int d) {
			this.d = d;
		}
	@Override
	public void println() {
		System.out.println("child2");
	}
		

	
	
		
}

 

728x90
반응형

+ Recent posts