다른 테이블에 대한 외부 키를 포함하는 테이블의 행을 삭제하는 방법
기본 키를 포함하는 기본 테이블이 있고 이 기본 테이블에 대한 외부 키를 포함하는 다른 테이블이 있다고 가정합니다.따라서 기본 테이블의 행을 삭제하면 하위 테이블도 삭제됩니다.
이 쿼리를 어떻게 작성합니까?
먼저, 일회성 데이터 스크러빙 연습으로 고립된 행을 삭제합니다.
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
'sourcetip' 카테고리의 다른 글
Oracle 열 데이터 크기 가져오기 (0) | 2023.07.17 |
---|---|
셀의 값이 다른 열의 값과 같으면 조건부로 셀 형식 지정 (0) | 2023.07.17 |
Python 변수의 인쇄 메모리 주소 (0) | 2023.07.17 |
셀러리가 유형(실행 예제)의 등록되지 않은 작업을 받았습니다. (0) | 2023.07.17 |
상한은 '자동'으로 설정하되 하한은 고정하는 방법 (0) | 2023.07.17 |