programing

ALTER TABLE 문에 'ON DELETE CASCADE'를 추가하는 방법

golfzon 2023. 3. 15. 20:08
반응형

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절은 제약 조건 상태만 수정할 수 있습니다(i-e: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;

앞에서 설명한 바와 같이:

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;

이 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;

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

ON DELETE/UPDATE CASCADE를 추가하여 FK 구속조건을 변경하는 절차는 다음과 같습니다.

넘버 1:

제약조건을 우클릭하여 [수정]을 클릭합니다.

여기에 이미지 설명 입력

넘버 2:

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

여기에 이미지 설명 입력

넘버 3:

마지막 단계는 수정 내용을 저장하는 것입니다(물론입니다).

여기에 이미지 설명 입력

PS: 다른 표에서 참조되고 있는 프라이머리 키를 수정하고 싶기 때문에 많은 작업으로부터 해방되었습니다.

MySQL을 사용하는 모든 사용자:

만약 당신이 그쪽으로 향한다면PHPMYADMIN갱신할 외부 키가 있는 테이블로 이동합니다.이때 해야 할 일은Relational view Structure을 을 변경합니다.On delete[ ]에서 [Select]를 합니다.Cascade.

아래 이미지:

여기에 이미지 설명 입력

외부 키를 삭제하지 않고 변경할 경우 다음을 수행할 수 있습니다.

ALTER TABLE child_table_name  WITH CHECK ADD FOREIGN KEY(child_column_name)
REFERENCES parent_table_name (parent_column_name) ON DELETE CASCADE

postgresql의 경우

BEGIN TRANSACTION ;
ALTER TABLE bank_accounts
    DROP CONSTRAINT bank_accounts_company_id_fkey;

ALTER TABLE bank_accounts
    ADD CONSTRAINT bank_accounts_company_id_fkey FOREIGN KEY (company_id)
        REFERENCES companies (id)
        ON DELETE CASCADE;
END;
ALTER TABLE `tbl_celebrity_rows` ADD CONSTRAINT `tbl_celebrity_rows_ibfk_1` FOREIGN KEY (`celebrity_id`) 
REFERENCES `tbl_celebrities`(`id`) ON DELETE CASCADE ON UPDATE RESTRICT;

MySQL workbench img 변경할 테이블을 마우스 오른쪽 버튼으로 클릭하고 테이블 변경을 클릭한 다음 외부 키를 클릭합니다.오른쪽에 [외부 키 옵션]이 표시되고 [cascade]를 선택하고 [적용]을 클릭하기만 하면 됩니다!

언급URL : https://stackoverflow.com/questions/1571581/how-to-add-on-delete-cascade-in-alter-table-statement

반응형