반응형
원형 외래 키가 있는 두 개의 테이블에서 삭제
테이블이 두개 있습니다.
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
반응형
'programing' 카테고리의 다른 글
C++ 문자열을 한 줄에 여러 개 연결하려면 어떻게 해야 합니까? (0) | 2023.09.16 |
---|---|
MySQL에서 NOW(), SYSDATE() 및 CURRENT_DATE()의 차이 (0) | 2023.09.16 |
MySQL에서 MSSQL IDENTITY 열과 동등함 (0) | 2023.09.16 |
CORS(Cross-Origin Resource Sharing) 개념 (0) | 2023.09.16 |
UITable View Cell의 동적 높이 문제(Swift) (0) | 2023.09.16 |