제약의 이름을 모르는 경우 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_CONDITION
의 LONG
데이터 유형 으로 작업하는 방법 이나 이름을 알고도 조회 제약 조건을 동적으로 삭제하는 방법을 잘 모르겠습니다.
그렇다면 이름이 아니라 무엇인지에 따라이 제약 조건을 삭제할 수있는 변경 스크립트를 어떻게 만들 수 있습니까?
편집 : @Allan의 대답은 좋은 대답이지만 시스템 생성 이름이있을 수있는 제약 조건이 제거 방법과 관련이 있다는 것이 보편적으로 사실이 아닐 수 있다는 것이 (오라클 전문 지식이 부족하여) 우려됩니다. 이름을 몰라도 제약. 해당 제약 조건을 논리적으로 삭제할 때 시스템 이름 제약 조건의 이름을 알지 않아도되는 방법이 항상 있다는 것이 사실입니까?
alter table MYTABLE modify (MYCOLUMN null);
Oracle에서는 열에 대해 null이 지정되지 않은 경우 null이 아닌 제약 조건이 자동으로 생성됩니다. 마찬가지로 널을 허용하도록 열이 변경되면 자동으로 삭제됩니다.
수정 된 질문 설명 :이 솔루션은 "not null"열에 대해 생성 된 제약 조건에만 적용됩니다. 이름을 지정하지 않고 열 정의에서 "Primary Key"또는 check 제약 조건을 지정하면 제약 조건 (및 기본 키의 인덱스)에 대한 시스템 생성 이름으로 끝납니다. 이 경우 삭제하려면 이름을 알아야합니다. 가장 좋은 방법은 "not null"이외의 모든 제약 조건에 대해 이름을 지정하여 시나리오를 피하는 것입니다. 일반적으로 이러한 제약 조건 중 하나를 삭제해야하는 상황에 처한 경우 PL / SQL 및 데이터 정의 테이블에 의존해야 할 것입니다.
시험:
alter table <your table> modify <column name> null;
nullable로 만들려는 필드가 기본 키의 일부인 경우에는 할 수 없습니다. 기본 키는 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 문을 보여줍니다. 테이블 생성 방법을 알면 모든 테이블 제약 조건을 볼 수 있습니다.
Michael McLaughlin의 블로그에서 발췌 한 답변 : http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ 그의 Database Design I 수업에서.
다른 값을 허용하기 위해 업데이트해야하는 사용자 지정 검사 제약 조건을 우회하려는 동일한 문제에 직면했습니다. 문제는 ALL_CONSTRAINTS가 제약 조건이 적용되는 열을 알려주는 방법이 없다는 것입니다. 내가 할 수 있었던 방법은 대신 ALL_CONS_COLUMNS를 쿼리 한 다음 각 제약 조건을 이름으로 삭제하고 다시 만드는 것입니다.
table_name = [TABLE_NAME] 및 column_name = [COLUMN_NAME] 인 all_cons_columns에서 constraint_name을 선택하십시오.
'Development Tip' 카테고리의 다른 글
Resharper를 사용한 맞춤 중괄호 서식 (0) | 2020.10.11 |
---|---|
(function () {}) () 구조는 어떻게 작동하며 사람들이 왜 그것을 사용합니까? (0) | 2020.10.11 |
표준 입력에서 정수 읽기 (0) | 2020.10.11 |
HttpWebRequest에 사용자 지정 헤더 추가 (0) | 2020.10.11 |
레티 나가 아닌 디스플레이에서 Mac OS X 10.8 Mountain Lion에서 레티 나 디스플레이 (HiDPI 모드)를 시뮬레이션하는 방법은 무엇입니까? (0) | 2020.10.11 |