2014-09-24 5 views
1

면책 조항 : 내 DB 지식고유 Contrains

내가 값을 갱신/삽입하는 기술이 존재하는지 알고 싶습니다 ... 그래서 Vertica의에서 몇 가지 오해 할 수 MySQL의에서 주로 온다 여러 세션에서 고유 한 제약 조건을 적용합니다. 제가 테이블을 가지고 있다고 가정 해 봅시다 :

'id', 'unique_field', 'some_filed' 

그리고 unique_field에 대한 유일한 제약이 있습니다. 내 이해는 Vertica에서 먼저 삽입을 수행하고 제약 조건 위반 여부를 확인하기 위해 ANALYZE_CONSTRAINTS를 수행해야한다는 것입니다. 필자의 경우, 동일한 테이블에 INSERT를 수행하는 여러 세션이 있으며 동일한 레코드를 푸시 할 수 있습니다. 나는 두 개의 별도의 세션에서이 순서를 실행하면

Insert into table (id, unique_field, some_field) values (5, 'abc', 'data'); 
SELECT ANALYZE_CONSTRAINTS(table); 
COMMIT; 

이 두 쿼리는 동일한 unique_field를 삽입하려고하는 기회가 그들 각각에 대해 아무런 구속이 없을 것 : 단일 세션의 순서로 나타납니다 별도의 거래에서 위반 사항이 감지되어 중복 데이터가 발생합니다.

이런 일이 발생하지 않도록 더 좋은 방법이 있습니까? 아니면 뭔가 빠졌어요.

답변

3

Vertica는 작업과 관련된 잠재적 인 오버 헤드 때문에로드시 고유 키 또는 고유 제한 조건의 고유성을 적용하지 않습니다.

ANALYZE_CONSTRAINTS()이 커밋 전에 실행되면 잠재적 중복을 포착 할 수 있어야합니다. UPDATE을 수행하는 오버 헤드도 있으므로 피해야합니다.

MERGE을 사용하거나 임시 테이블에서 데이터를 준비하는 것과 같이로드에 고유성을 적용하는 방법이 있습니다. 각 방법마다 고유 한 제한이 있습니다. 내 blog post에서 데이터의 고유성 적용에 대한 자세한 내용을 볼 수 있습니다.

업데이트 : 7.2에서 Vertica는 기본 및 고유 키 제약 조건을 자동으로 적용 할 수 있습니다. 자세한 내용은 documentation을 참조하십시오.

+0

명확히하기 위해 ANALYZE_CONSTRAINS()는 올바르게 실행되는 트랜잭션의 범위 내에서 작동합니까? 다른 병렬 트랜잭션이 실행되고있는 경우 어느 쪽도 제약 조건을 위반하려고 서로를 "볼"것입니다. –

+0

@phraktal 거래와 분리되어야합니다. – Kermit