기본 키가있는 SQL 테이블에 데이터를 삽입합니다. Dupes의 경우 - 오류 삽입을 허용하거나 먼저 선택하십시오.

StackOverflow https://stackoverflow.com/questions/411575

  •  03-07-2019
  •  | 
  •  

문제

다음과 같은 테이블이 주어졌습니다.

CREATE TABLE dbo.MyTestData (testdata varchar(50) NOT NULL) 

ALTER TABLE dbo.MyTestData WITH NOCHECK ADD CONSTRAINT [PK_MyTestData] PRIMARY KEY  CLUSTERED (testdata) 

그리고 알려진 복제본이있는 외부 데이터 목록에서 추가 할 항목을 수집 할 때 고유 한 'TestData'목록을 원한다는 점을 감안할 때 ... 삽입 저장 프로 시저를 수행 할 때 절차가 존재를 테스트하도록 작성 해야하는지 또는해야합니다. 오류 만 허용합니까? 가장 일반적인 관행은 무엇입니까? 나는 항상 존재에 대한 시험을 수행했지만 지난 밤에 토론하고있었습니다 ...

CREATE PROCEDURE dbo.dmsInsertTestData @ptestdata VarChar(50)
AS
  SET NOCOUNT ON

  IF NOT EXISTS(SELECT testdata FROM dbo.MyTestData WHERE testdata=@ptestdata)
  BEGIN
    INSERT INTO dbo.MyTestData (testdata ) VALUES (@ptestdata)
  END

RETURN 0

아니면이 문제를 실행할 때 PK 위반 오류를 캡처/무시합니까?

CREATE PROCEDURE dbo.dmsInsertTestData @ptestdata VarChar(50)
AS
  SET NOCOUNT ON
  INSERT INTO dbo.MyTestData (testdata ) VALUES (@ptestdata)
RETURN 0
도움이 되었습니까?

해결책

나는 항상 한 가지 진술로 그것을한다.

INSERT INTO dbo.MyTestData (testdata ) VALUES (@ptestdata)
WHERE NOT EXISTS(SELECT 1 FROM dbo.MyTestData WHERE testdata=@ptestdata)

다른 팁

잠재적 인 레이스 조건이 있기 때문에 오류 검사 (예 : "존재하지 않는 경우 ...") 작동하거나 작동하지 않을 수 있습니다 (다른 트랜잭션이 존재하지 않으면 삽입문 이전에 다른 트랜잭션이 레코드를 삽입하는 경우).

따라서 전에 확인하든 아니든, 삽입 문을 실패 할 수있는 것처럼 코딩해야합니다.

확인하고 싶은지 여부 또한 (대신)는 당신과 당신의 UI에 달려 있습니다.

나는 대부분의 프로그래머가 예외를 피하는 것을 제안 할 것이라고 생각합니다. T-SQL의 성능 관점에서 확실하지 않지만 .NET에서는 예외가 추가 IF/Else 문보다 비용이 더 많이 든다고 생각합니다.

당신이 준 첫 번째 예에 대한 나의 관심사는 그것이 사용자에게 오류를 반환하지 않는다는 것입니다. 그렇게하기 위해 고정 될 수 있지만 오류를 반환하지 않으면 사용하지 않습니다.

두 가지 가능성 사이의 우려가 큰 테이블에서의 성능이라면, 둘 다 테스트하고 하나가 다른 테이블보다 훨씬 빠른지 확인하는 것이 좋습니다. IF Select가 특히 복잡하고 대부분의 시간에 삽입물이 발생 해야하는 경우, 단순히 실패하는 것이 대부분의 시간이 더 빠를 수 있습니다. 반면에, 나쁜 입력의 가능성이 높고 IF가 여기에 표시된 것처럼 상대적으로 복잡하지 않으면 다른 프로세스가 더 나을 수 있습니다. 그러나 실제 데이터 구조 및 데이터 및 실제 쿼리를 사용하여 실제 테스트만으로도 Deiffernt 층이 다를 수 있으므로 성능이 더 좋은지 알 수 있습니다.

나는 그것이 저장된 절차의 특성에 달려 있다고 생각합니다. 기본적으로, 당신은 그들과 관련이있는 경우 (또는 절차의 클라이언트를 위해 캡슐화 할 것인지) 오류를 처리하고 그들과 관련이없고 다른 사람에게 더 친근하게 만들 수 없다면 전파를 남겨 두어야합니다. 응용 프로그램의 계층.

저장 프로 시저가 원시 데이터를 삽입하도록 설계된 경우 가능한 오류를 처리하기 위해 응용 프로그램을 남겨 두어야한다고 생각합니다. 저장된 절차가 추상화 계층으로 설계된 경우 직무 특정 실행과는 반대로 성명) 그리고 오류를 처리하고 그것으로 무언가를 수행하거나 신청서에 우아한 방식 (예 : 잘 정의 된 오류 코드)으로보고 할 수 있습니다. 그렇지 않으면 데이터베이스가 아닌 중복 데이터를 삽입하지 않도록 응용 프로그램에 달려 있어야합니다 (데이터베이스는 이미 기본 키로이를 시행했습니다).

사용자 친화적이 되려면 종종 선택을 수행하는 것이 좋습니다. 레코드가 이미 존재하는 경우 사용자에게이를보고/또는 편집 할 수있는 기회를 제공합니다.

예를 들어, 사용자가 새로운 고객 레코드를 추가하는 경우 해당 고객에 대해 이미 표시된 정보를 검토 할 수 있습니다. 전화 번호와 같이 레코드에 추가 할 추가 정보가있을 수 있습니다.

이러한 종류의 시나리오에서는 레코드를 추가하는 것을 거부하는 것이 기존 복제본을 보는 능력을 제공하는 것보다 도움이되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top