2014-07-24 2 views
4

MySQL의 고유 컬럼과 관련하여 질문하고 싶습니다. 이 문제에 접근하는 더 나은 방법, 장점 또는 단점이있을 경우 전문가에게 질문하고 싶습니다. 포함 된 VARCHAR 열을 남겨 MYSQL에 고유 한 컬럼의 단점이 있습니까?

  • 대 행> 0이 코드를 실행을 계속 영향을받는 경우
    • 는 SQL INSERT는
    • 을 무시 마십시오
    • 같은 고유 VARCHAR 열을 설정 고유하지 않음
    • 동일한 값을 찾기 위해 검색어를 입력하십시오.
    • 행이 쿼리에서 반환이 있다면,
    • 이 고유 인덱스는 몇 가지 장점을 가지고로 열을 정의 코드
+0

두 번째 경우에는 아무 것도 삽입하지 않겠습니까? – Thilo

+0

mysql의 "배후"를 모른다. 하지만 IGNORE 키워드는 테이블을 통해 실행되고 발견되지 않으면 값을 삽입하는 것으로 진행됩니다. 실제로 영향을받는 행을 반환 할 수있는 함수를 사용하는 경우 IGNORE 함수가 가장 유용 할 것이라고 생각합니다 – Caweren

+0

열의 값이 데이터베이스에서 제공 한 도구를 사용하는 것보다 유일해야하고 고유하지 않은 값을 삽입하려고하면 데이터베이스가 throw하는 예외입니다. – Stefan

답변

3

를 실행 진행하여 SQL INSERT를 수행, 우선 당신은로 정의 할 때 "고유 인덱스"MySQL은 고유 값 (기본 키와 동일)에 대해 인덱스를 최적화 할 수 있습니다. mysql은 조회에 최적화 된 알고리즘을 사용할 수 있도록 동일한 값을 가진 행이 더 있는지 확인할 필요가 없기 때문입니다.

또한 코드의 여러 위치에서이 코드를 처리하지 않고 데이터베이스에 이중 항목이 없도록되어 있습니다.

UNIQUE로 정의하지 않으면 먼저 테이블에 레코드가 있는지 확인한 다음 성능이 떨어지는 대신 2 개의 쿼리 (심지어 전체 테이블 잠금)가 필요한 항목을 삽입해야합니다. 난 당신이 INSERT는 항목이 allready 여전히 당신이 어쩌면 고성능 작업을 위해 그것을 사용할 수 있습니다 (데이터베이스에 존재하는 경우 느릅 나무는 예외를 무시 무시 사용할 것이라는 사실을 떠날거야

http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html

경향이 더 오류입니다 어떤 특별한 경우). 엔트리가 이미 존재하는 경우 일반적인 INSERT가 피드백을 제공합니다.

+0

테이블을 검색하여 동시성 삽입이 작동하지 않으면 고유성을 보장합니다. 두 개의 삽입은 테이블을 쿼리하고 비 고유 항목을 제공하는 삽입을 위해 OK라고 말할 수 있습니다. – Jaydee

+0

그게 바로 프로세스에서 전체 테이블 잠금을 필요로하는 것입니다. –

+0

죄송합니다, 귀하의 지적에 대해 오해했습니다. – Jaydee

3

두 가지 방법 중 어느 것도 좋지 않습니다.

INSERT IGNORE을 검색하거나 검색하지 마십시오. 검색 부분은 동시성에서 실패하고 무결성을 손상시키기 때문에 신뢰할 수 없습니다. 이 시나리오를 생각해보십시오 : 당신과 나는 같은 정보를 데이터베이스에 삽입하려고합니다. 우리는 동시에 연결합니다. 문제의 코드는 우리 모두를 위해 데이터베이스에 그러한 레코드가 없음을 결정합니다. 우리는 모두 동일한 데이터를 삽입합니다. 이제 컬럼이 고유하지 않으므로 동일한 두 레코드로 끝날 것입니다. 이제 완전성이 실패합니다.

열을 unique으로 설정하고 예외를 원하는 언어로 삽입하고 catch하십시오. 중복 기록의 경우 MySQL이 실패하고 MySQL을위한 적절한 db 드라이버가 이것을 예외로 해석합니다. 언어가 무엇인지 언급하지 않았으므로 예제로 진행하기가 어렵습니다.

관련 문제