[SQL] 어떻게 무시하는 "중복 키"T-SQL의 오류 (SQL 서버)
SQL어떻게 무시하는 "중복 키"T-SQL의 오류 (SQL 서버)
여러 개의 SQL 문 (INSERT, UPDATE 및 / 또는 DELETES)를 포함하는 트랜잭션을 가지고있다. 실행할 때, 나는 중복 오류 문을 무시하고 다음 명령문에 계속합니다. 그 일을하는 가장 좋은 방법은 무엇입니까?
해결법
-
==============================
1.중복 삽입을 시도하지 않도록 당신에게 나의 강조 조언 당신의 SQL을 구성하는 것이지만, 나는 문에 오류가 롤백의 원인 필요하지 않습니다 언급 할 (필립 켈리의 조각은 당신이 필요 아마도).
중복 삽입을 시도하지 않도록 당신에게 나의 강조 조언 당신의 SQL을 구성하는 것이지만, 나는 문에 오류가 롤백의 원인 필요하지 않습니다 언급 할 (필립 켈리의 조각은 당신이 필요 아마도).
XACT_ABORT가 ON하지 않는 한, 트랜잭션 오류는 연결을 죽일 심한 정도가 아니라면 발생하지 않습니다 자동으로 롤백합니다. OFF로 XACT_ABORT 기본 설정됩니다.
예를 들어, 다음과 같은 SQL 성공적으로 테이블에 세 개의 값을 삽입합니다 :
create table x ( y int not null primary key ) begin transaction insert into x(y) values(1) insert into x(y) values(2) insert into x(y) values(2) insert into x(y) values(3) commit
당신이 XACT_ABORT를 설정하지 않는 한, 오류가 클라이언트와 롤백의 원인에 제기되고있다. 어떤 무서운 이유는 중복을 삽입 피할 수없는 경우 클라이언트에 오류 트랩 할 수 있어야하고, 그것을 무시해야한다.
-
==============================
2.난 당신이 색인에 IGNORE_DUP_KEY 옵션을 찾고 있습니다 생각합니다. http://msdn.microsoft.com/en-us/library/ms186869.aspx 대신 오류의 경고를 생산하는 중복 삽입 시도가 발생하는 문서화 된 IGNORE_DUP_KEY ON 옵션에서보세요.
난 당신이 색인에 IGNORE_DUP_KEY 옵션을 찾고 있습니다 생각합니다. http://msdn.microsoft.com/en-us/library/ms186869.aspx 대신 오류의 경고를 생산하는 중복 삽입 시도가 발생하는 문서화 된 IGNORE_DUP_KEY ON 옵션에서보세요.
-
==============================
3.SquareCog의 대답에 귀하의 코멘트에 확장, 당신은 할 수 있습니다 :
SquareCog의 대답에 귀하의 코멘트에 확장, 당신은 할 수 있습니다 :
INSERT INTO X VALUES(Y,Z) WHERE Y NOT IN (SELECT Y FROM X) INSERT INTO X2 VALUES(Y2,Z2) WHERE Y2 NOT IN (SELECT Y FROM X2) INSERT INTO X3 VALUES(Y3,Z3) WHERE Y3 NOT IN (SELECT Y FROM X3)
자, 내가 열 Y 모두 세 개의 테이블에 존재하는 것으로 가정합니다. 테이블이 Y.에 인덱싱되지 않은 경우 성능이 저하 될 것이라는 점을주의
그들이 색인하고 있으므로,이 최적으로 수행해야합니다 - 오, 그래, Y는 그것에 고유 제한 조건이 있습니다.
-
==============================
4.하여 현재 문을 중단, "중복 오류 문을 무시"하고 트랜잭션을 중단하지 않고 다음 문을 계속한다면 단지 .. 각 문 주위의 END TRY를 TRY을 BEGIN 넣어 :
하여 현재 문을 중단, "중복 오류 문을 무시"하고 트랜잭션을 중단하지 않고 다음 문을 계속한다면 단지 .. 각 문 주위의 END TRY를 TRY을 BEGIN 넣어 :
BEGIN TRY INSERT ... END TRY BEGIN CATCH /*required, but you dont have to do anything */ END CATCH ...
-
==============================
5.나는 다음과 차임 싶습니다
나는 다음과 차임 싶습니다
데이터의 99 %가 "바보"삽입에 비해 (20 개 라인 / 초에 같은, 내 경우에는, 200 선에서 / 초) 엄청난 성능 저하의 선택 사전에 결과를하고 오류없이 삽입 가서 가끔를 잡는 경우 오류.
오류 일들은 "PRIMARY KEY 제약 조건 위반"을 무시하고 후 (헤드 룸은 "무엇 병목 자원이 없습니다"로 정의되는) 다른 자원이 병목되고 다시 갔다.
어떤 내가 처음에이 토론에 착륙 온 이유입니다.
-
==============================
6.확인. 일부 오류 처리를 시도 후, 나는 내가 가지고 있던 문제를 해결하는 방법을 알아 냈어.
확인. 일부 오류 처리를 시도 후, 나는 내가 가지고 있던 문제를 해결하는 방법을 알아 냈어.
다음은이 작업을하는 방법의 예입니다 (저는 누락 된 무언가가 있다면 알려주세요) :
SET XACT_ABORT OFF ; -- > really important to set that to OFF BEGIN DECLARE @Any_error int DECLARE @SSQL varchar(4000) BEGIN TRANSACTION INSERT INTO Table1(Value1) VALUES('Value1') SELECT @Any_error = @@ERROR IF @Any_error<> 0 AND @Any_error<>2627 GOTO ErrorHandler INSERT INTO Table1(Value1) VALUES('Value1') SELECT @Any_error = @@ERROR IF @Any_error<> 0 AND @Any_error<>2627 GOTO ErrorHandler INSERT INTO Table1(Value1) VALUES('Value2') SELECT @Any_error = @@ERROR IF @Any_error<> 0 AND @Any_error<>2627 GOTO ErrorHandler ErrorHandler: IF @Any_error = 0 OR @Any_error=2627 BEGIN PRINT @ssql COMMIT TRAN END ELSE BEGIN PRINT @ssql ROLLBACK TRAN END END
위의 거래의 결과로, 표 값은 다음 값 1, 값이있을 것이다.
2627 그런데 중복 키에 대한 오류 코드입니다.
프롬프트 응답 및 유용한 제안에 대한 여러분 모두 감사합니다.
-
==============================
7.
INSERT INTO KeyedTable(KeyField, Otherfield) SELECT n.* FROM (SELECT 'PossibleDupeLiteral' AS KeyField, 'OtherfieldValue' AS Otherfield UNION ALL SELECT 'PossibleDupeLiteral', 'OtherfieldValue2' ) LEFT JOIN KeyedTable k ON k.KeyField=n.KeyField WHERE k.KeyField IS NULL
이 같은 데이터 그것을 발견하면 아무것도 삽입 (이 중복 키를 확인하지 희망 같은 빠른 방법)를 찾기 위해 서버를 알려줍니다.
나는 서버가 자동으로 자신의 속는 키 오류를 무시하면 IGNORE_DUP_KEY 솔루션 너무하지만, 캐치 문제에 대한 오류에 의존하는 다음 사람이 신비화 될 것 같은.
나는 필립 켈리의 솔루션을 통해이를 선택하는 이유는 데이터의 여러 행을 제공 할 수 있습니다 만 누락 된 사람이 실제로 얻을 점이다 :
-
==============================
8.내가 같은 일을하려고했기 때문에 내가 여기 온; 나는 소스 데이터에 속는했다 만 대상 데이터를 업데이트하고 속는을 추가 할 싶어 알고 있었다.
내가 같은 일을하려고했기 때문에 내가 여기 온; 나는 소스 데이터에 속는했다 만 대상 데이터를 업데이트하고 속는을 추가 할 싶어 알고 있었다.
나는 당신이 업데이트하거나 누락 다른 및 INSERT 것들 DELETE 일 수 있기 때문에 병합 여기에 잘 작동합니다 생각합니다.
나는이 일을 끝내었고, 그것은 큰 일했습니다. 나는 Excel 파일을 통해 루프 SSIS를 사용하고 속는 모든과 함께 "RAW"SQL 테이블에로드. 그럼 난 생산 테이블과 "원시"테이블을 병합 병합을 실행합니다. 그럼 다음 Excel 파일에 "원시"테이블과 이동 TRUNCATE.
-
==============================
9.SQL 서버 2000 :
SQL 서버 2000 :
INSERT INTO t1 (ID, NAME) SELECT valueid, valuename WHERE NOT EXISTS (SELECT 0 FROM t1 as t2 WHERE t2.ID = valueid AND t2.name = valuename)
-
==============================
10.기본 키 정의 동안 사용 IGNORE_DUP_KEY = OFF를 삽입하는 동안 중복을 무시합니다. 예를 들면
기본 키 정의 동안 사용 IGNORE_DUP_KEY = OFF를 삽입하는 동안 중복을 무시합니다. 예를 들면
create table X( col1.....) CONSTRAINT [pk_X] PRIMARY KEY CLUSTERED ( )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 70) ON [PRIMARY] ) ON [PRIMARY]
-
==============================
11.그럼 당신은 임시 테이블과이 문제를 해결할 수 ..
그럼 당신은 임시 테이블과이 문제를 해결할 수 ..
DECLARE @RoleToAdds TABLE ([RoleID] int, [PageID] int) INSERT INTO @RoleToAdds ([RoleID], [PageID]) VALUES (1, 2), (1, 3), (1, 4), (2, 5) INSERT INTO [dbo].[RolePages] ([RoleID], [PageID]) SELECT rta.[RoleID], rta.[PageID] FROM @RoleToAdds rta WHERE NOT EXISTS (SELECT * FROM [RolePages] rp WHERE rp.PageID = rta.PageID AND rp.RoleID = rta.RoleID)
이 데이터의 큰 양을 위해 작동하지 않을 수도 있지만 몇 행을 위해 작동합니다!
-
==============================
12.키는 고유해야합니다. 그렇게하지 마십시오. 필요에 따라 재 설계.
키는 고유해야합니다. 그렇게하지 마십시오. 필요에 따라 재 설계.
(당신이 다음 삭제를 삽입하려고하는, 그리고 삽입이 실패 할 경우 ... 단지 중 문에서 오류에 삭제 첫째. 롤백을).
from https://stackoverflow.com/questions/1139050/how-to-ignore-duplicate-key-error-in-t-sql-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] Yii2와 액티브를 사용하여 실제 SQL 쿼리를 로그? (0) | 2020.06.04 |
---|---|
[SQL] 어떻게 레코드를 삽입하고 하나의하는 SqlCommand를 사용하여 새로 생성 된 ID를 반환? (0) | 2020.06.04 |
[SQL] 어떻게 PostgreSQL을에있는 테이블의 목록 열 이름과 데이터 유형을 얻으려면? (0) | 2020.06.04 |
[SQL] 당신은 어떻게 T-SQL에서 기본 값 또는 유사한 제약 조건을 삭제합니까? (0) | 2020.06.04 |
[SQL] SQL 서버와 마지막 행을 읽는 방법 (0) | 2020.06.04 |