[sql] ALTER TABLE 문에 ‘ON DELETE CASCADE’를 추가하는 방법

내 테이블에 외래 키 제약 조건이 있는데 ON DELETE CASCADE를 추가하고 싶습니다.

나는 이것을 시도했다 :

child_table_name 테이블 변경
  구속 조건 수정 fk_name
  외래 키 (child_column_name)
  삭제 계단식에서 parent_table_name (parent_column_name)을 참조합니다.

작동하지 않습니다.

편집 :
외래 키가 이미 존재합니다. 외래 키 열에 데이터가 있습니다.

문을 실행 한 후에 나타나는 오류 메시지 :

ORA-02275 : 이러한 참조 제약이 이미 테이블에 존재합니다



답변

ON DELETE CASCADE기존 구속 조건에 추가 할 수 없습니다 . 당신은해야합니다 drop및 재 create구속을. 문서 것을 보여 MODIFY CONSTRAINT조항 만 수정할 수 있습니다 제약의 상태 (예 : ENABLED/DISABLED…).


답변

먼저 drop외국 키와 위의 명령 시도는 넣어 add constraint대신 modify constraint. 이제 이것은 명령입니다 :

ALTER TABLE child_table_name
  ADD CONSTRAINT fk_name
  FOREIGN KEY (child_column_name)
  REFERENCES parent_table_name(parent_column_name)
  ON DELETE CASCADE;


답변

이 PL * SQL은 삭제 캐스케이드가없는 각 제한 조건을 삭제하고 삭제 캐스케이드로 다시 작성하는 스크립트를 DBMS_OUTPUT에 작성합니다.

참고 :이 스크립트의 출력 실행은 사용자의 책임입니다. 결과 스크립트를 읽고 실행하기 전에 편집하는 것이 가장 좋습니다.

DECLARE
      CURSOR consCols (theCons VARCHAR2, theOwner VARCHAR2) IS
        select * from user_cons_columns
            where constraint_name = theCons and owner = theOwner
            order by position;
      firstCol BOOLEAN := TRUE;
    begin
        -- For each constraint
        FOR cons IN (select * from user_constraints
            where delete_rule = 'NO ACTION'
            and constraint_name not like '%MODIFIED_BY_FK'  -- these constraints we do not want delete cascade
            and constraint_name not like '%CREATED_BY_FK'
            order by table_name)
        LOOP
            -- Drop the constraint
            DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || cons.OWNER || '.' || cons.TABLE_NAME || ' DROP CONSTRAINT ' || cons.CONSTRAINT_NAME || ';');
            -- Re-create the constraint
            DBMS_OUTPUT.PUT('ALTER TABLE ' || cons.OWNER || '.' || cons.TABLE_NAME || ' ADD CONSTRAINT ' || cons.CONSTRAINT_NAME
                                        || ' FOREIGN KEY (');
            firstCol := TRUE;
            -- For each referencing column
            FOR consCol IN consCols(cons.CONSTRAINT_NAME, cons.OWNER)
            LOOP
                IF(firstCol) THEN
                    firstCol := FALSE;
                ELSE
                    DBMS_OUTPUT.PUT(',');
                END IF;
                DBMS_OUTPUT.PUT(consCol.COLUMN_NAME);
            END LOOP;

            DBMS_OUTPUT.PUT(') REFERENCES ');

            firstCol := TRUE;
            -- For each referenced column
            FOR consCol IN consCols(cons.R_CONSTRAINT_NAME, cons.R_OWNER)
            LOOP
                IF(firstCol) THEN
                    DBMS_OUTPUT.PUT(consCol.OWNER);
                    DBMS_OUTPUT.PUT('.');
                    DBMS_OUTPUT.PUT(consCol.TABLE_NAME);        -- This seems a bit of a kluge.
                    DBMS_OUTPUT.PUT(' (');
                    firstCol := FALSE;
                ELSE
                    DBMS_OUTPUT.PUT(',');
                END IF;
                DBMS_OUTPUT.PUT(consCol.COLUMN_NAME);
            END LOOP;

            DBMS_OUTPUT.PUT_LINE(')  ON DELETE CASCADE  ENABLE VALIDATE;');
        END LOOP;
    end;


답변

앞에서 설명한대로 :

ALTER TABLE TABLEName
drop CONSTRAINT FK_CONSTRAINTNAME;

ALTER TABLE TABLENAME
ADD CONSTRAINT FK_CONSTRAINTNAME
    FOREIGN KEY (FId)
    REFERENCES OTHERTABLE
        (Id)
    ON DELETE CASCADE ON UPDATE NO ACTION;

보시다시피 명령을 분리하고 추가해야합니다.


답변

MYSQL 사용자를위한 답변 :

ALTER TABLE ChildTableName
DROP FOREIGN KEY `fk_table`;
ALTER TABLE ChildTableName
ADD CONSTRAINT `fk_t1_t2_tt`
  FOREIGN KEY (`parentTable`)
  REFERENCES parentTable (`columnName`)
  ON DELETE CASCADE
  ON UPDATE CASCADE;


답변

MySQL을 사용하는 모든 사람 :

당신은 당신에 머리를하면 PHPMYADMIN당신이해야 할 클릭, 당신은 업데이트 할 외래 키가있는 테이블에 웹 페이지 및 탐색 Relational view 에있는 Structure탭과 변경 On delete에 선택 메뉴 옵션을 Cascade.

아래 표시된 이미지 :

여기에 이미지 설명을 입력하십시오


답변

여기에 편리한 해결책이 있습니다! SQL Server 2008 R2를 사용하고 있습니다.

ON DELETE / UPDATE CASCADE를 추가하여 FK 제약 조건을 수정하려면 다음 단계를 수행하십시오.

숫자 1 :

구속 조건을 마우스 오른쪽 버튼으로 클릭하고 수정을 클릭하십시오.

여기에 이미지 설명을 입력하십시오

2 번:

왼쪽에서 구속 조건을 선택하십시오 (둘 이상있는 경우). 그런 다음 오른쪽에서 ” INSERT And UPDATE Specification “지점을 축소 하고 규칙 삭제 또는 규칙 업데이트 행에서 필요에 따라 작업을 지정하십시오. 그런 다음 대화 상자를 닫습니다.

여기에 이미지 설명을 입력하십시오

번호 3 :

마지막 단계는 이러한 수정 사항을 저장하는 것입니다 (물론!)

여기에 이미지 설명을 입력하십시오

추신 : 다른 테이블에서 참조 된 기본 키를 수정하고 싶기 때문에 많은 작업에서 나를 구했습니다.