제약 이름을 모르는 경우 Oracle에서 "not null"제약 조건을 어떻게 삭제할 수 있습니까?


85

필드에 NOT NULL 제약 조건이있는 데이터베이스가 있으며이 제약 조건을 제거하고 싶습니다. 복잡한 요인은이 제약 조건에 시스템 정의 이름이 있고 제약 조건의 이름이 프로덕션 서버, 통합 서버 및 다양한 개발자 데이터베이스간에 다르다는 것입니다. 우리의 현재 프로세스는 변경 스크립트를 체크인하는 것이며 자동화 된 작업은 대상 데이터베이스에 대해 sqlplus를 통해 적절한 쿼리를 실행하므로 sqlplus로 바로 보낼 수있는 솔루션을 선호합니다.

내 데이터베이스에서 이것을 삭제하는 SQL은 다음과 같습니다.

alter table MYTABLE drop constraint SYS_C0044566

all_constraints뷰를 쿼리 할 때 제약 조건을 볼 수 있습니다.

select * from all_constraints where table_name = 'MYTABLE'

그러나 SEARCH_CONDITIONLONG데이터 유형 으로 작업하는 방법 또는 이름을 알고도 조회 제약 조건을 동적으로 삭제하는 방법을 잘 모르겠습니다.

그렇다면 이름이 아니라 무엇인지에 따라이 제약 조건을 삭제할 수있는 변경 스크립트를 어떻게 만들 수 있습니까?


편집 : @Allan의 대답은 좋은 대답이지만 시스템 생성 이름을 가질 수있는 제약 조건이 제거 방법과 관련이 있다는 것이 보편적으로 사실이 아닐 수 있다는 것이 (오라클 전문 지식이 부족하여) 우려됩니다. 이름을 몰라도 제약. 해당 제약 조건을 논리적으로 삭제할 때 시스템 이름 제약 조건의 이름을 알지 않아도되는 방법이 항상 있다는 것이 사실입니까?


3
호기심을 충족시키기 위해 : NOT NULL 제약 조건은 제약의 이름을 알 필요없이 제거 할 수있는 Oracle 의 유일한 제약 유형입니다. 다른 모든 제약 유형은 제약의 이름을 알아야합니다.
제프리 켐프

답변:


166
alter table MYTABLE modify (MYCOLUMN null);

Oracle에서는 열에 대해 null이 지정되지 않은 경우 null이 아닌 제약 조건이 자동으로 생성됩니다. 마찬가지로 널을 허용하도록 열이 변경되면 자동으로 삭제됩니다.

수정 된 질문 설명 :이 솔루션은 "not null"열에 대해 생성 된 제약 조건에만 적용됩니다. 이름을 지정하지 않고 열 정의에서 "Primary Key"또는 check 제약 조건을 지정하면 제약 조건 (및 기본 키의 인덱스)에 대한 시스템 생성 이름으로 끝납니다. 이 경우 삭제하려면 이름을 알아야합니다. 가장 좋은 방법은 "not null"이외의 모든 제약 조건에 대해 이름을 지정하여 시나리오를 피하는 것입니다. 일반적으로 이러한 제약 조건 중 하나를 삭제해야하는 상황에 처한 경우 PL / SQL 및 데이터 정의 테이블에 의존해야 할 것입니다.


사실 이라기에는 너무 좋아 보이지만 현재의 경우를 확실히 처리하고 분명히 간단합니다! Oracle에서 제약 이름이 시스템 생성 될 수 있지만 제약 이름을 피하기 위해 SQL을 작성할 수없는 경우가 있습니까?
Chris Farmer

1
감사합니다 ... not null제약 조건이 제 스키마에서 이런 식으로 저에게 영향을 미칠 수있는 유일한 시스템 이름이라는 것이 밝혀졌습니다 .
Chris Farmer


1

nullable로 만들려는 필드가 기본 키의 일부인 경우에는 할 수 없습니다. 기본 키는 null 필드를 가질 수 없습니다.


1

사용 된 제약 조건을 찾으려면 아래 코드를 사용하십시오.

-- Set the long data type for display purposes to 500000.

SET LONG 500000

-- Define a session scope variable.

VARIABLE output CLOB

-- Query the table definition through the <code>DBMS_METADATA</code> package.

SELECT dbms_metadata.get_ddl('TABLE','[Table Described]') INTO :output FROM dual;

이것은 본질적으로 참조 된 테이블이 만들어지는 방법에 대한 create 문을 보여줍니다. 테이블이 생성되는 방법을 알면 모든 테이블 제약 조건을 볼 수 있습니다.

Michael McLaughlin의 블로그에서 가져온 답변 : http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ 그의 Database Design I 수업에서.


0

다른 값을 허용하기 위해 업데이트해야하는 사용자 지정 검사 제약 조건을 우회하려는 동일한 문제에 직면했습니다. 문제는 ALL_CONSTRAINTS가 제약 조건이 적용되는 열을 알려주는 방법이 없다는 것입니다. 내가 할 수 있었던 방법은 대신 ALL_CONS_COLUMNS를 쿼리 한 다음 각 제약 조건을 이름으로 삭제하고 다시 만드는 것입니다.

table_name = [TABLE_NAME] 및 column_name = [COLUMN_NAME] 인 all_cons_columns에서 constraint_name을 선택하십시오.


0

임시 테이블에 구조를 복사 할 때 그런 일이 발생하여 not null을 제거했습니다.

DECLARE
   CURSOR cur_temp_not_null IS
        SELECT table_name, constraint_name  FROM all_constraints WHERE table_name LIKE 'TEMP_%' AND  owner='myUSUARIO';

   V_sql VARCHAR2(200); 

BEGIN
  FOR c_not_null IN cur_temp_not_null
   LOOP
     v_sql :='ALTER TABLE ' || c_not_null.table_name || ' DROP CONSTRAINT '|| c_not_null.constraint_name;
     EXECUTE IMMEDIATE  v_sql;     
  END LOOP;
END;

Stack Overflow는 영어 전용 사이트입니다. 그러나 Stack Overflow en español이 있습니다. 내 편집을 참조하십시오.
help-info.de dec.

0

테이블을 생성하는 동안 이름없이 STATUS 열에 대한 제약 조건이 생성 된 경우 Oracle은 이에 대해 임의의 이름을 할당합니다. 안타깝게도 제약 조건을 직접 수정할 수는 없습니다.

STATUS 컬럼에 링크 된 이름없는 제한 조건 삭제와 관련된 단계

  1. STATUS 필드를 새 필드 STATUS2에 복제
  2. STATUS2에 대한 CHECK 제약 조건 정의
  3. STATUS에서 STATUS2로 데이터 마이그레이션
  4. STATUS 열 삭제
  5. STATUS2의 이름을 STATUS로 변경

    ALTER TABLE MY_TABLE ADD STATUS2 NVARCHAR2(10) DEFAULT 'OPEN'; ALTER TABLE MY_TABLE ADD CONSTRAINT MY_TABLE_CHECK_STATUS CHECK (STATUS2 IN ('OPEN', 'CLOSED')); UPDATE MY_TABLE SET STATUS2 = STATUS; ALTER TABLE MY_TABLE DROP COLUMN STATUS; ALTER TABLE MY_TABLE RENAME COLUMN STATUS2 TO STATUS;

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.