programing

제약 조건의 이름을 모를 때 Oracle에서 "not null" 제약 조건을 삭제하려면 어떻게 해야 합니까?

newsource 2023. 3. 21. 22:12

제약 조건의 이름을 모를 때 Oracle에서 "not null" 제약 조건을 삭제하려면 어떻게 해야 합니까?

필드에 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의 답변은 훌륭하지만, (Oracle의 전문지식이 부족하기 때문에) 시스템에서 생성된 이름을 가진 제약조건이 그 이름을 몰라도 제약조건을 제거할 수 있다는 것은 보편적으로 사실이 아닐 수 있습니다.논리적으로 제약조건을 폐기할 때 시스템 이름 제약조건의 이름을 알 필요가 없는 방법은 항상 있다는 것이 사실입니까?

alter table MYTABLE modify (MYCOLUMN null);

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

수정된 질문의 명확화:이 솔루션은 "null이 아닌" 열에 대해 작성된 제약 조건에만 적용됩니다.이름을 지정하지 않고 열 정의에서 "기본 키" 또는 검사 제약 조건을 지정하면 제약 조건에 대한 시스템 생성 이름(및 기본 키에 대한 색인)이 지정됩니다.이 경우 이름을 알아야 드롭할 수 있습니다."not null" 이외의 모든 제약조건의 이름을 반드시 지정하여 시나리오를 피하는 것이 좋습니다.이러한 제약 조건 중 하나를 일반적으로 해제해야 하는 경우 PL/SQL 및 데이터 정의 테이블을 사용해야 합니다.

시험:

alter table <your table> modify <column name> null;

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

사용된 제약 조건을 검색하려면 다음 코드를 사용하십시오.

-- 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 문을 보여줍니다.테이블 작성 방법을 알면 모든 테이블 제약 조건을 확인할 수 있습니다.

마이클 맥러플린의 블로그 http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/의 데이터베이스 디자인 I 수업에서 얻은 답변입니다.

다른 값을 허용하기 위해 업데이트해야 하는 커스텀체크 제약을 회피하기 위해 동일한 문제에 직면해 있었습니다.문제는 ALL_Constraints가 어느 열에 제약이 적용되는지 알 수 있는 방법이 없다는 것입니다.그 대신 ALL_CONS_COLUMN을 쿼리하고 각 제약조건을 이름으로 삭제한 후 다시 작성합니다.

table_name = [ TAB ]에서 all_cons_module에서 contraint_name을 선택합니다.LE_NAME] 및 column=ame = [COLUMN_NAME];

구조물을 임시 테이블로 복사했을 때 그런 일이 있어서 늘이 아닌 것을 제거했습니다.

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;

테이블을 작성할 때 이름 없이 STATUS 열의 제약 조건이 생성된 경우 Oracle은 해당 제약 조건의 이름을 임의로 할당합니다.유감스럽게도 우리는 그 제약조건을 직접 수정할 수 없습니다.

STATUS 열에 연결된 이름 없는 제약 조건을 삭제하는 단계

  1. STATUS 필드를 새 필드로 복제 2
  2. STATUS2에서 CHECK 제약조건을 정의합니다.
  3. STATUS에서 STATUS2로 데이터 이행
  4. [ Drop 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;

언급URL : https://stackoverflow.com/questions/2540615/how-can-i-drop-a-not-null-constraint-in-oracle-when-i-dont-know-the-name-of-t