본문 바로가기

IT/DB

The class 'A테이블' is marked as REUSE_OID and is non-referable. Non-referable classes can't be the domain of an attribute and their instances' OIDs cannot be returned. 오류 원인?

728x90
반응형

 

 

오류 원인

 

The class 'A테이블' is marked as REUSE_OID and is non-referable. Non-referable classes can't be the domain of an attribute and their instances' OIDs cannot be returned.

 

이 오류는 큐브리드(CUBRID)에서 테이블이 REUSE_OID로 설정되어 있을 때 발생합니다.

REUSE_OID란?

  • 테이블이 REUSE_OID로 설정되면, 객체 ID(OID)가 재사용되므로 해당 테이블을 다른 테이블에서 참조(외래키 관계)할 수 없습니다.
  • 즉, 이 테이블을 다른 테이블에서 외래키(FK) 또는 참조 타입(REFERENCE) 으로 사용할 수 없습니다.
  • 또한, SELECT 쿼리에서 OID를 반환할 수 없습니다.

오류 발생 상황

  1. 다른 테이블에서 REFERENCE 타입으로 사용하려는 경우
    • ❌ A테이블이 REUSE_OID로 설정되어 있어서 REFERENCE 타입을 사용할 수 없음.
CREATE TABLE B테이블 (
    id INT PRIMARY KEY,
    a_ref A테이블 -- A테이블을 참조하려고 함
);

 

  1. OID를 반환하는 쿼리를 실행한 경우
    • ❌ REUSE_OID 설정된 테이블에서는 OID를 직접 반환할 수 없음.
SELECT A테이블 FROM A테이블;

해결 방법

✅ 1. REUSE_OID 제거

테이블을 REUSE_OID 없이 다시 생성해야 합니다.

 

1) 기존 테이블 삭제 후 다시 생성

 
DROP TABLE A테이블;
CREATE TABLE A테이블 (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);
 
 

📌 REUSE_OID 옵션이 없는 상태로 다시 생성하면, 다른 테이블에서 참조 가능해집니다.


✅ 2. REUSE_OID 설정을 변경하는 방법

 

이미 생성된 테이블에서는 REUSE_OID를 직접 변경할 수 없으므로, 기존 데이터를 백업 후 새로운 테이블로 옮기는 방식을 사용합니다.

 

1) 기존 데이터 백업

CREATE TABLE A테이블_백업 AS SELECT * FROM A테이블;
 
 

2) 기존 테이블 삭제

DROP TABLE A테이블;
 

3) REUSE_OID 없이 다시 생성

CREATE TABLE A테이블 (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);
 
 

4) 데이터 복원

INSERT INTO A테이블 SELECT * FROM A테이블_백업;
DROP TABLE A테이블_백업;

결론

  • REUSE_OID가 설정된 테이블은 다른 테이블에서 참조 불가능하며, OID를 반환할 수도 없음.
  • 해결하려면 테이블을 REUSE_OID 없이 다시 생성해야 함.
  • 기존 데이터를 유지하려면 백업 후 다시 생성하는 방법을 사용.
300x250
반응형