2014-06-11 2 views
2

테이블에 NULL 열이 없기 때문에 null 값을 허용해야합니다. 나는 해결책을Oracle - 열을 NULL로 설정하면 CHECK 제한이 적용되지 않음

alter table USER modify(FIRST_NAME null); 

을 알고 있지만 CHECK ("FIRST_NAME" IS NOT NULL) 기존 제거하지 않기 때문에, 내 경우에는 작동하지 않을 것 같다. 이 제약 조건은 시스템 이름이 SYSxxxxx이므로이 제약 조건을 직접 비활성화 할 수 없습니다 (환경에 따라 이름이 다르기 때문에). 나는이 테이블이 데이터베이스에 덤프를로드하여 생성되었다는 사실과 관련이 있다고 가정합니다. 그리고 어떤 이유에서든 Oracle은 열 속성과 CHECK 사이의 연결을 끊습니다. 어떻게 이런 일이 벌어지고 어떻게 해결할 수 있을지 생각해?

+1

는'alter'가 실행될 때 제대로 작동합니까 내 경우가 아니거나 오류가 무엇입니까? 따옴표가 붙지 않는 한 테이블 이름은 실제로 'USER'일 수는 없지만 문제인 경우 ORA-00932를 받게됩니다. –

+0

테이블 이름이 바뀌 었습니다. 실제로는 USER로 이름이 지정되지 않았습니다. 이 변경은 오류없이 끝나고 열 정의에서 NOT NULL을 제거하지만 CHECK (NOT NULL)을 제거하지 않음 – kuchi

+0

변경 전에 두 개의 명백하게 동일한 (SYS_C 이름과 다른) 제약 조건이 있는지 알고 있습니까? vav가 보여 주었 듯이, 당신이 명시 적으로'is not null' 제약 조건을 만들었고 컬럼을 not-null로 설정하면 그 상태에있을 수 있습니다. 수입이나 재건 후에 실수로 일어난 일을 기억하지만, 어떤 도구에 문제가 있었는지 정확히 기억할 수는 없습니다. 나는 dbms_metadata가 때때로 그렇게 할 것이라고 생각한다. 다른 환경에는 두 가지 제약 조건이 있습니까? 어쩌면 그게 실제로 문제가 아니겠습니까? –

답변

1

음을 생성, 나는이 해결책을 가지고왔다.

alter table USER rename column FIRST_NAME to FIRST_NAME_OLD; 
alter table USER ADD FIRST_NAME VARCHAR2(40 CHAR) NULL; 
update USER set first_name=first_name_old; 
alter table USER drop column FIRST_NAME_OLD; 

나는 그것은 큰 테이블에 성능 문제가있을 수 있습니다 알고 있지만 그

3

만들기 NOT NULL 제약 조건 및 CHECK :

create table tmp(
n1 number not null, 
n2 number check (n2 is not null) 
) 
/
select * from all_constraints where table_name = 'TMP' 
/

출력 (빼기) :

constraint_name constraint_type table_name search_condition 
--------------- --------------- ---------- ---------------- 
SYS_C0036560  C     TMP   "N1" IS NOT NULL 
SYS_C0036561  C     TMP   n2 is not null 

그래서, 그들은 거의 사전에 동일 보인다.

필자는 테이블/열 조합으로 제약 조건 이름을 찾은 다음 (동적 SQL을 사용하여) 삭제/비활성화하는 스크립트가 필요하다고 생각합니다.


더 많은 의견 :) 차이가 있습니다! 테이블에 대한 쿼리 결과를 확인할 수 있습니까?

select column_name, NULLABLE from USER_TAB_COLS where table_name = 'TMP' 

COLUMN_NAME     NULLABLE 
------------------------------ -------- 
N1        N   
N2        Y  

내가

alter table tmp drop constraint SYS_C0036560 

N1 열이 Null을 허용 할 후 :

COLUMN_NAME     NULLABLE 
------------------------------ -------- 
N1        Y   
N2        Y  

이뿐만 아니라 당신을 위해 작동하는 경우, 다음 스크립트

select 'alter table ' || table_name || ' drop constraint ' || constraint_name || ';' 
from all_constraints where table_name in ('TMP', 'list of your tables') 
and constraint_type = 'C' 
and instr(upper(search_condition, 'IS NOT NULL') > 0 
and replace(
substr(upper(search_condition), 1, instr(search_condition, ' ')), 
'"', '') in ('FIRST_NAME', 'maybe some other columns names') 
+0

'FIRST_NAME N' - null 값을 표시하지 않지만 null 값을 허용하지 않는 ID입니다. – kuchi

+0

N은 Null을 허용하지 않습니다. 이 경우 null을 허용해서는 안됩니다. 아니면 다른 말을하려고 했나요? 나는 당신 문장에 '그러나'의아해를 당한다. – vav

+0

내 문법에 대해 미안합니다. null을 사용할 수 없다는 것을 의미합니다. null을 삽입하면 오류가 발생합니다. – kuchi