복붙노트

[SQL] 다른 테이블에 외래 키를 포함하는 테이블에서 행을 삭제하는 방법

SQL

다른 테이블에 외래 키를 포함하는 테이블에서 행을 삭제하는 방법

기본 키를 포함하는 기본 테이블이이 기본 테이블에 대한 외부 키를 포함하는 다른 테이블이 가정하자. 우리는 기본 테이블의 행을 삭제하면 그래서 그것은 또한 자식 테이블을 삭제합니다.

어떻게이 쿼리를 작성합니까?

해결법

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

    1.귀하의 질문에서, 나는 당신이 계단식 DELETES이 켜져 있다고 가정하는 것이 안전하다고 생각합니다. 이 경우에 필요한 모든입니다

    귀하의 질문에서, 나는 당신이 계단식 DELETES이 켜져 있다고 가정하는 것이 안전하다고 생각합니다. 이 경우에 필요한 모든입니다

    DELETE FROM MainTable
    WHERE PrimaryKey = ???
    

    당신이 데이터베이스 엔진은 해당 참조 레코드를 삭제 처리됩니다.

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

    2.첫째, 운동을 데이터-스크러빙 한 시간으로, 예를 들어, 고아 행을 삭제

    첫째, 운동을 데이터-스크러빙 한 시간으로, 예를 들어, 고아 행을 삭제

    DELETE 
      FROM ReferencingTable 
     WHERE NOT EXISTS (
                       SELECT * 
                         FROM MainTable AS T1
                        WHERE T1.pk_col_1 = ReferencingTable.pk_col_1
                      );
    

    둘째, 한 번 스키마 변경 운동으로, 예를 들어, 참조하는 테이블에 외부 키에 DELETE CASCADE 참조 켜기 작업을 추가

    ALTER TABLE ReferencingTable DROP 
       CONSTRAINT fk__ReferencingTable__MainTable;
    
    ALTER TABLE ReferencingTable ADD 
       CONSTRAINT fk__ReferencingTable__MainTable 
          FOREIGN KEY (pk_col_1)
          REFERENCES MainTable (pk_col_1)
          ON DELETE CASCADE;
    

    자신의 참조 행이 삭제 될 때 다음, 영원, 참조하는 테이블의 행이 자동으로 삭제됩니다.

  3. ==============================

    3.아래 그림과 같이 삭제 cascade 옵션을 외래 키 제약 조건을 변경할 수 있습니다. 삭제 할 때 마스터 테이블 행에 관련된 chind 테이블 행을 삭제합니다.

    아래 그림과 같이 삭제 cascade 옵션을 외래 키 제약 조건을 변경할 수 있습니다. 삭제 할 때 마스터 테이블 행에 관련된 chind 테이블 행을 삭제합니다.

    ALTER TABLE MasterTable
    ADD CONSTRAINT fk_xyz 
    FOREIGN KEY (xyz) 
    REFERENCES ChildTable (xyz) ON DELETE CASCADE 
    
  4. ==============================

    4.당신은 다중 행이있는 경우 삭제하고 당신은 당신의 테이블의 구조를 변경하지 않으 당신은 커서를 사용할 수 있습니다. 1 - 먼저 (커서에서) 삭제 행을 선택해야합니다 2 그런 다음 커서의 각 행에 대해 당신이 참조하는 행을 삭제하고 그 후 그에게 행에게 자기를 삭제합니다.

    당신은 다중 행이있는 경우 삭제하고 당신은 당신의 테이블의 구조를 변경하지 않으 당신은 커서를 사용할 수 있습니다. 1 - 먼저 (커서에서) 삭제 행을 선택해야합니다 2 그런 다음 커서의 각 행에 대해 당신이 참조하는 행을 삭제하고 그 후 그에게 행에게 자기를 삭제합니다.

    전의:

    --id is primary key of MainTable
        declare @id int
        set @id = 1
        declare theMain cursor for select FK from MainTable where MainID = @id
        declare @fk_Id int
        open theMain
        fetch next from theMain into @fk_Id
        while @@fetch_status=0
        begin
            --fkid is the foreign key 
            --Must delete from Main Table first then child.
            delete from MainTable where fkid = @fk_Id
            delete from ReferencingTable where fkid = @fk_Id
            fetch next from theMain into @fk_Id
        end
        close theMain
        deallocate theMain
    

    희망 유용

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

    5.삭제 폭포에서와 외래 키 옵션을 설정해야합니다 ... 외래 키 열이 포함 된 테이블에 .... 그것은 ALTER 테이블을 사용하여 나중에 테이블 작성시 설정하거나 추가 할 필요가

    삭제 폭포에서와 외래 키 옵션을 설정해야합니다 ... 외래 키 열이 포함 된 테이블에 .... 그것은 ALTER 테이블을 사용하여 나중에 테이블 작성시 설정하거나 추가 할 필요가

  6. from https://stackoverflow.com/questions/3656099/how-to-delete-rows-in-tables-that-contain-foreign-keys-to-other-tables by cc-by-sa and MIT license