2009-06-11 2 views
0

내 문제는 내가 사용하는 데이터가 이미 데이터베이스에있는 복제본이 될지 확인하기 위해 쿼리를 실행하고 싶습니다. 예를 들어 제품 코드가 있고 여러 번 나열된 동일한 항목을 중지하려는 경우, 이 제품 코드는 기본 키입니다.SQL에서 기본 키 위반을 쉽게 감지하거나 예측할 수 있습니까?

SELECT ProductCode FROM tblProducts WHERE ProductCode = '12345' 

을 그리고 모든 레코드를 반환하거나, 거기에 좀 더 우아한 솔루션입니다 확인, 나는이 방법을 사용하여 상관 없어하지만 될 투박한 것 같다
나는이 일을 피할 수 있습니다. 이것은 제품 삽입이 한 번만 발생해야하므로 코드에 대한 추가 유효성 검사 일뿐입니다. 그러나 새로 고침 또는 뒤로 가기 버튼 (웹 기반 시스템)으로 인해 중복 된 값이 입력되었으므로 오류 검사를 원합니다.

이 문제가 P = NP 유형 문제인지 아니면 문제를 너무 과소 평가합니까?
내 데이터베이스가 도움이되는 경우 MS SQL Server 2000입니다.

+0

이것은 P = NP 문제가 아닙니다. 분명히 생각하고있는 것입니다. 그다지 좋지 않으므로 실제로 새로 고침과 뒤로 가기 버튼 사용을 수정해야합니다. –

+0

피드백에 대한 예 감사합니다. 뒤로 버튼에 대처하고 새로 고침하는 것은 모든 웹 기반 시스템이 대처해야하는 것입니다. 이것이 재로드에서 가장 문제가있는 유일한 문제였습니다. – RoguePlanetoid

답변

7

SQL 삽입을 실패하게하고 SQL Server에서 기본 키 위반 오류를 처리하고 처리하도록하는 것이 좋습니다. SQL Server는 인덱스를 관리하며 수년간 해왔습니다. 나는 그들의 구현이 대부분의 개발자 들보 다 여러차례 더 잘 될 것이라고 확신한다. 이를 위해 프로그램을 작성하려고하는 경우 모든 키를 읽고 어딘가에 색인에 보관해야합니다. SQL Server는 이미이를 수행하고 있습니다. 따라서 두 번 확인하고 필요한 공간을 두 배로 늘립니다.

데이터베이스 연결이 일부 또는 다른 이유로 매우 느린 경우에만이 작업을 고려할 것입니다.

그렇지 않으면 SQL 서버가 좋은 일을 할 수 있도록하고 당신은 단지 하나를 얻을 것이다 중복이있는 경우 당신은 당신이 그런 식으로 추출물을 열을 기준으로 단지 그룹을 할 수있을 때 나머지 :

+0

이 방법은 "The Art of SQL"에서 권장됩니다. http://www.amazon.com/Art-SQL-Stephane-Faroult/dp/0596008945 –

+0

오류가 발생하기 때문에이 옵션이 가장 좋을 것 같습니다.이 옵션을 사용하면이 옵션을 사용하면 오류 메시지가 표시됩니다 추가되는 복제본을 나타냅니다. – RoguePlanetoid

+0

이것은 포스터가 뒤로 버튼을 다루는 것에 관한 질문을 제외하고는 수용 가능한 해결책입니다. –

0

나는 이것이 얼마나 자주 발생할지에 달려 있다고 생각합니다.

극히 드물게 발생하는 경우, 위반 가능성을 파악하고 그에 따라 사용자에게 알립니다.

비교적 자주 발생할 수있는 경우, 처음에는 새 항목이 정상적인 지 여부를 확인한 다음 삽입에 실제로 적용되는지 확인해야합니다. 반면에 이것이 자주 발생한다면, 앱 논리에 문제가있을 것입니다. 고유 한 기본 키를 생성하고 할당하는 확실한 방법이 있어야합니다. 절대로 삽입 충돌을 일으키지 않습니다. INT IDENTITY 열 또는 다른 수단을 사용하여.

마크

+0

이 문제는 비교적 드문 경우이며 일부 상황에서만 발생합니다. 프로그램 논리를 조정할 수 있지만 정상적인 응용 프로그램에서 여러 페이지에 걸쳐 발생합니다. 기존 코드는 정상적으로 작동 할 것입니다. 웹 기반의 경우 버튼과 새로 고침과 같은 문제가 생길 수 있습니다. – RoguePlanetoid

2

단순히 SQL 그것이 자체 데이터베이스에 포함 된 (그러나 모든 사람이 이에 대한 자신의 견해가 있습니다) 그래서 더 나은 저장 프로 시저에 싸여

IF NOT EXISTS (SELECT * FROM tblProducts WHERE tblProducts = '12345') 
    INSERT tblProducts (tblProducts, columnlist, ...) 
    VALUES ('12345', valuelist, ...) 

이를 삽입하기 전에 먼저 테스트 할 수 있습니다.

+0

이것은 내가 선택한 것이지만, 중복 된 상황은 제품 코드가 바코드 번호이며 충돌이 일찍 발견 되었기 때문에 내가 처리하고 싶은 예외입니다. 그러나 이것은 제가 확인하고 싶은 추가 검사입니다. – RoguePlanetoid

1

을 열. 여러 열을 반환하는 경우 반환 할 모든 열을 그룹화하면됩니다.

0

아마도 웹 응용 프로그램의 디자인에 문제가 있습니까? 당신은 데이터가 http POST를 통해서만 데이터베이스에 변형되어 있는지 확인하고 있습니까? 그런 다음 해당 페이지 응답의 만료 시간이 0 또는 지금인지 확인하십시오 (날짜 기반 또는 밀리 초 기반인지 여부는 기억이 안납니다). 다시 방문한 사용자에게 "양식 데이터를 다시 게시 하시겠습니까?"메시지가 표시되거나 브라우저에서 '페이지 만료 됨'링크가 표시됩니다.

다음으로 사용자 입력을 허용하는 페이지는 내결함성이 있어야합니다. 기본 키가 사용자에 의해 입력 된 것 같습니다. 그러나 계산 된 데이터가 아닌 고유 키가있는 것이 합리적입니다.

해당 상황을 처리하기위한 일반적인 전략은 무엇입니까? (p = np가 아닙니다.)이 문제는 데이터베이스 장르의 많은 응용 프로그램에 직면 해 있습니다. 다른 포스터가 그 문제에 대한 해결책을 제시해 준 것 같습니다.

행운을 빌어 요.

관련 문제