필드에 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을 선택하십시오.
답변
임시 테이블에 구조를 복사 할 때 그런 일이 발생하여 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;
답변
테이블을 생성하는 동안 이름없이 STATUS 열에 대한 제약 조건이 생성 된 경우 Oracle은 이에 대해 임의의 이름을 할당합니다. 안타깝게도 제약 조건을 직접 수정할 수는 없습니다.
STATUS 컬럼에 링크 된 이름없는 제한 조건 삭제와 관련된 단계
- STATUS 필드를 새 필드 STATUS2에 복제
- STATUS2에 대한 CHECK 제약 조건 정의
- STATUS에서 STATUS2로 데이터 마이그레이션
- STATUS 열 삭제
-
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;