복붙노트

[SQL] 어떻게 ALTER TABLE 문에서 'DELETE CASCADE ON'추가

SQL

어떻게 ALTER TABLE 문에서 'DELETE CASCADE ON'추가

내 테이블의 외래 키 제약 조건을 가지고, 나는 그것을 DELETE CASCADE ON 추가 할.

나는이 시도했다 :

alter table child_table_name
  modify constraint fk_name
  foreign key (child_column_name)
  references parent_table_name (parent_column_name) on delete cascade;

작동하지 않습니다.

편집하다: 외래 키는 이미 외래 키 열에 데이터가 존재.

나는 문을 실행 후 얻을 오류 메시지 :

ORA-02275: such a referential constraint already exists in the table

해결법

  1. ==============================

    1.당신은 이미 기존의 제약에 DELETE CASCADE ON 추가 할 수 없습니다. 당신은 삭제하고 제약 조건을 다시 만들어야합니다. 수정 (MODIFY) CONSTRAINT 절은 제약 조건의 상태를 수정할 수있는 문서 쇼 (I-E는 : 활성화 / 비활성화를 ...).

    당신은 이미 기존의 제약에 DELETE CASCADE ON 추가 할 수 없습니다. 당신은 삭제하고 제약 조건을 다시 만들어야합니다. 수정 (MODIFY) CONSTRAINT 절은 제약 조건의 상태를 수정할 수있는 문서 쇼 (I-E는 : 활성화 / 비활성화를 ...).

  2. ==============================

    2.먼저 외래 키를 삭제하고 위의 명령 대신 수정 제약 넣어 추가 제약 조건을 시도합니다. 이제이 명령은 다음과 같습니다

    먼저 외래 키를 삭제하고 위의 명령 대신 수정 제약 넣어 추가 제약 조건을 시도합니다. 이제이 명령은 다음과 같습니다

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

    3.이 PL * SQL은 삭제 폭포가 있고 삭제 계단식으로 다시 작성하지 않는 각 제약 조건을 삭제하는 스크립트를 DBMS_OUTPUT을 작성합니다.

    이 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;
    
  4. ==============================

    4.마찬가지로 전에 설명 :

    마찬가지로 전에 설명 :

    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;
    

    당신이 볼 수 있듯이 사람들은 처음에 추가 한 후 삭제, 분리 명령해야한다.

  5. ==============================

    5.MYSQL 사용자의 답변 :

    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;
    
  6. ==============================

    6.당신은 업데이트 할 외래 키, 당신이해야 할 모든이 구조 탭에있는 관계형보기를 클릭하고 계단식으로 삭제 선택 메뉴 옵션에서 변경되어있는 테이블에 phpMyAdmin을 웹 페이지 및 탐색에 머리를합니다.

    당신은 업데이트 할 외래 키, 당신이해야 할 모든이 구조 탭에있는 관계형보기를 클릭하고 계단식으로 삭제 선택 메뉴 옵션에서 변경되어있는 테이블에 phpMyAdmin을 웹 페이지 및 탐색에 머리를합니다.

    이미지는 다음과 같습니다 :

  7. ==============================

    7.여기에 편리한 솔루션입니다! 나는 SQL Server 2008 R2를 사용하고 있습니다.

    여기에 편리한 솔루션입니다! 나는 SQL Server 2008 R2를 사용하고 있습니다.

    당신이 DELETE / UPDATE CASCADE ON 추가하여 FK 제약 조건을 수정할 때, 다음 단계를 수행하십시오 :

    오른쪽 제약 클릭하고 수정을 클릭

    (하나 이상이있는 경우) 왼쪽에있는 당신의 제약 조건을 선택합니다. 그런 다음 오른쪽에, 붕괴 "INSERT와 UPDATE 사양"포인트와는 당신의 필요에 맞게 규칙 삭제 또는 업데이트 규칙 행의 동작을 지정합니다. 그 후, 대화 상자를 닫습니다.

    마지막 단계는 논문 수정을 저장하는 것입니다 (물론!)

    PS : 나는 다른 테이블에서 참조하는 기본 키를 수정할 그것은 작업의 무리에서 저를 저장합니다.

  8. ==============================

    8.당신은 당신이 할 수있는 그것을 포기하지 않고 외부 키를 변경하려면 :

    당신은 당신이 할 수있는 그것을 포기하지 않고 외부 키를 변경하려면 :

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

    9.

    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;
    
  10. from https://stackoverflow.com/questions/1571581/how-to-add-on-delete-cascade-in-alter-table-statement by cc-by-sa and MIT license