programing

원형 외래 키가 있는 두 개의 테이블에서 삭제

subpage 2023. 9. 16. 09:05
반응형

원형 외래 키가 있는 두 개의 테이블에서 삭제

테이블이 두개 있습니다.

TableOne (TABLE_ONE_ID (pk), TABLE_TWO_ID (fk), ...(something else) )
TableTwo (TABLE_TWO_ID (pk), TABLE_ONE_ID (fk), ...(something else) )

이 테이블에서 레코드를 삭제하려면 어떻게 해야 합니까?

P.S. 저는 디자인이 나쁘다고 생각하지만, 이것은 제 잘못이 아니며 데이터베이스 구조를 변경할 수 있는 권한이 없습니다.이 테이블에서 기록을 삭제하는 방법만 알면 됩니다.

이 문제를 해결하는 최선의 방법은 확실하지 않지만 아마도 다음과 같은 작업을 수행할 것입니다.

UPDATE TableOne SET TABLE_TWO_ID = null;
DELETE FROM TableTwo;
DELETE FROM TableOne;

다음을 사용하여 외부 키를 비활성화할 수 있습니다.

alter table TableOne disable constraint fk_table_two_id;

그런 다음 행을 삭제할 수 있습니다.

Dave Costa의 의견에 따라 제약 조건 검사를 연기할 수 있습니다.이렇게 하면 제약 조건이 각 개별 SQL 문이 아닌 전체 트랜잭션에서 확인됩니다.예를 들어,

begin transaction;
set constraints all deferred; 
delete from TableTwo;
delete from TableOne;
commit transaction;

외부 키 중 하나를 연기하거나 NULL이 가능하다고 가정하여 NULL을 할당하여 주기를 중단합니다.

그건 그렇고, 데이터는 어떻게 삽입하고 있습니까?당신도 거기서 주기를 깨기 위해 뭔가를 했을 것입니다.

참고: 세심하게 제어된 세션 하나만 데이터베이스를 수정하는 경우에는 FK를 비활성화하거나 삭제해도 무방하지만, 다른 클라이언트가 자신이 예상하는 FK가 더 이상 적용되지 않는다는 것을 모를 수 있는 동시 환경에서는 데이터 손상의 가능성을 크게 열어둘 수 있습니다.

언급URL : https://stackoverflow.com/questions/12212664/delete-from-two-tables-with-circular-foreign-keys

반응형