2009-12-23 3 views
1

데이터베이스의 is_deleted 필드를 true로 설정하여 레코드를 삭제하려는 응용 프로그램을 작성 중이며 기본값은 false입니다.is_deleted 필드를 설정하고 인덱스를 사용하여 데이터베이스에서 필드 삭제

이것은 잘 작동하지만 고유 한 필드를 인덱스 할 때 문제가 발생합니다. 이전 항목은 실제로 삭제되지만 DB 관점에서는 삭제되지 않지만 동일한 항목이있는 필드를 삽입 할 수 없습니다.

주위에 해결책이 있습니까?

감사합니다,

답변

5

또 다른 옵션은 열을 deleted_at 같은 날짜 필드로 변경하는 것입니다. 신원 + 날짜에 대한 고유 제한 조건을 작성하면 충분히 고유해야합니다.

+0

deleted_at은 null 일 수 없습니다. 예를 들어 '9999-12-31 00:00:00'의 기본값이 필요하며 쿼리는 기본값을 알아야합니다. 그러나 정말로 is_deleted 방식으로 가고 싶다면 아마도 이것이 최선의 선택 일 것입니다. – wallenborn

+0

나는 그 진술이 당신의 DBMS에 달려 있다고 생각한다. – Brad

0

당신이 실제로 고유 할 필요가 is_deleted과 어떤 다른 필드의 조합을 통해 고유 인덱스를 확인합니다.

+1

이것은 삭제 된 항목과 삭제되지 않은 항목 중 하나만 삭제할 수 있음을 의미합니다. – Brad

3

삭제 된 행의 "ID"를 "다시 사용"하려면 행을 "소프트 삭제"할 때 해당 ID 필드를 지워야합니다. 내 의견으로는 정말 좋은 생각이 아닙니다. 그 행을 삭제 취소하려면 무엇을해야할까요?

왜 이러한 ID를 다시 사용 하시겠습니까? 나는 그런 구조에서 벗어날 것입니다 - 단지 각 행에 그것의 자신의 정체성을 부여하십시오 - 그것이 활동적이든 삭제 되든 - 그리고 기존의 정체성을 재사용하지 마십시오. 좋은 연습은 아닙니다!

1

식별자를 다시 사용할 수 있어야하는 경우 데이터베이스에 열에 대한 고유 제한 조건이 없어야합니다. 고유성은 애플리케이션에서 보장해야합니다. DB가 실제로 그것을 원한다면, 내가 생각할 수있는 유일한 방법은 IsDeleted = 0 인 컬럼에 대해서만 유일성을 검증하는 방아쇠가 될 것이다.

1

다른 언급했듯이, isn 이 일을하는 가장 좋은 방법입니다. is_deleted 및 ID 필드 전체에서 고유 한 인덱스를 확장하더라도 한 번에 하나의 삭제 된 개체 만 가질 수 있습니다.

대체 접근법은 ID가 할당 될 고유하지 않은 필드를 추가하는 것입니다. 씨 헤인즈 말을 좋아하는대로 설치 제거의 역순입니다,

update table 
    set old_id = id, id = null, is_deleted = 1 
where id = ? 

그리고 그것을 복원 : 뭔가를 삭제하려면이 같은 것을 실행됩니다. 좀 더 영리해야하므로 일부 데이터베이스 (기침 MSSQL 기침가) 고유 제약 열에서 여러 NULL 값을 허용하지 않는 것이

참고.

0

첫 번째 열은 이미 ID와 FALSE의 키 조합이 있으므로 두 번째 행을 삭제할 수 없기 때문에 Pavel의 접근 방식을 사용하지 않을 것입니다.

고유 ID가 필요한 경우 고유 한 ID 열을 만듭니다. 현재 ID 열은 색인 된 것 (중복 허용) 일 것입니다. 현재 ID 열의 이름이 외부 ID이므로 이름을 지정하고 적절하게 처리합니다.

관련 문제