2011-02-16 6 views
2

postgresql 9.0 db에 고유 한 색인이 있습니다. 나는 아직 시도한 수동 테스트에서 실패하게 만들었지 만 쿼리 할 때 db에서 중복 된 부분을보고있다.고유 인덱스에 대해 고유하지 않은 항목이있는 이유는 무엇입니까? (PostgreSQL 9.0)

확인이 아웃 :

Index: "users_screen_name_idx" UNIQUE, btree (lower(screen_name::text)) 

# select lower(screen_name), count(1) from users group by lower(screen_name) having count(1) > 1; 

lower   | count 
---------------+------- 
xxx xxx 3735 |  2 
xxx xxx 37383 |  2 
... (36 more) ... 
       | 17254 
(39 rows) 

모든 아이디어를 어떻게 이런 일이? 나는 NULL이 유일하지 않다는 것을 안다. 그것은 문제가 아니며, 다른 38 행이다.

+0

이것은 무서운 일입니다. 나는 9.3이 체크섬을 통해 구축 된 유효성 검사를 얻고 시스템이 잘못된 결과를 반환하기 전에이 유효성 검사를 포착하지 않기를 바란다. 또한 이러한 유형의 데이터가 잡히거나 막히는 경우 데이터가 ZFS 파일 시스템에 있는지 궁금합니다. – Kuberchaun

답변

1

수동으로 데이터베이스 시스템을 실패 시키려고하면 인덱스 손상이 발생할 가능성이 있습니다. 색인 (REINDEX)을 다시 작성하십시오. 중복 된 값으로 인해 오류가 발생하면 오류가 발생합니다.

+0

REINDEX를 수행하지 않고 사전 프로세스로 인덱스 손상을 검사하고 실패했는지 확인하는 방법이 있습니까? – Kuberchaun

+0

사실은 아니지만 정기적 인 진공 청소는 부수적 인 검사를 수행합니다. –

0

PostgreSQL에서 트리거를 비활성화 할 수 있습니다. 이는 매우 위험한 옵션이지만 고유 또는 외부 키 제한을 위반하는 테이블에 실제로 데이터를 추가하는 데 사용될 수 있습니다.

+0

우리가 트리거를 사용하지 못하게하는 유일한 시간은 DB 복원 (외부 키 오류를 가져 오는 db w/o를 가져올 수 있도록하기 위해 수행해야하는)입니다. – daryn

+0

또는 지연된 FK 제약 조건을 사용하고 단일 트랜잭션으로 데이터베이스를 가져올 수 있습니다. – Daniel

0

테이블 상속을 사용하는 경우 고유 제약 조건이 상속되지 않으므로이 문제가 발생할 수 있습니다. 사실 이것은 아마도 이런 종류의 일의 가장 일반적인 원인이며 데이터 손상이 아닙니다.

인덱스를 삭제했다가 다시 만들면 실패합니까?

그렇지 않은 경우 복제본이 다른 곳에 있습니다.

관련 문제