sourcetip

다른 테이블에 대한 외부 키를 포함하는 테이블의 행을 삭제하는 방법

fileupload 2023. 7. 17. 21:21
반응형

다른 테이블에 대한 외부 키를 포함하는 테이블의 행을 삭제하는 방법

기본 키를 포함하는 기본 테이블이 있고 이 기본 테이블에 대한 외부 키를 포함하는 다른 테이블이 있다고 가정합니다.따라서 기본 테이블의 행을 삭제하면 하위 테이블도 삭제됩니다.

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

먼저, 일회성 데이터 스크러빙 연습으로 고립된 행을 삭제합니다.

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

둘째, 일회성 스키마 변경 연습으로 다음을 추가합니다.ON 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;

그러면 참조된 행이 삭제될 때 참조 테이블의 행이 자동으로 삭제됩니다.

질문하신 바로는, CASCADING DELETE가 켜져 있다고 가정해도 무방할 것 같습니다.
그 경우에 필요한 것은

DELETE FROM MainTable
WHERE PrimaryKey = ???

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

아래와 같이 삭제 캐스케이드 옵션을 사용하여 외부 키 제약 조건을 변경할 수 있습니다.삭제 시 마스터 테이블 행과 관련된 바인딩 테이블 행이 삭제됩니다.

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

삭제할 행이 여러 개 있지만 테이블 구조를 변경하지 않으려면 커서를 사용할 수 있습니다. 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

희망은 유용합니다

모든 행을 삭제하려면 계단식으로 잘라내기를 사용할 수 있습니다.

TRUNCATE TABLE products CASCADE;

캐스케이드 삭제외부 키 옵션을 설정해야 합니다...외부 키 열이 포함된 테이블에서...테이블 생성 시 설정하거나 ALTER 테이블을 사용하여 나중에 추가해야 합니다.

언급URL : https://stackoverflow.com/questions/3656099/how-to-delete-rows-in-tables-that-contain-foreign-keys-to-other-tables

반응형