2014-04-22 2 views
0

삽입 행을 사용하여 테이블에 값 행을 삽입하는 방법을 알고 있습니다. 그러나 내가 가진 작업을 수행하는 데 적합한 관용어를 찾을 수 없습니다.행이 다른 테이블의 테이블에 존재하지 않으면 행 삽입

두 개의 테이블이 있습니다. 한 테이블은 기본 테이블이고 다른 테이블은 추가 테이블입니다. 중복을 무시하고 추가 테이블에서 기본 테이블에 존재하지 않는 행을 삽입해야합니다.

나는 몇 가지 변화를 사용하는 것을 시도하고있다 :

replace into primary 
select * from additional; 

을하지만 분명히 내가 원하는하지 않은 행을 대체합니다. 어떻게 든 on duplicate을 사용해야합니까, 아니면 완전히 잘못된 방향으로 사용해야합니까?

편집

:

열 모두는 정수 값입니다 고유 대리 키 열이 있습니다.

답변

1

는, 그 다음은 중복 키에 오류가 발생합니다. 첫 번째는 insert ignore입니다 : insert ignore

insert ignore into primary(col1, . . .) 
    select col1, . . . 
    from secondary; 

문제는이 모든 오류를 무시한다는 것입니다. 따라서 중복 된 고유 키 오류 이외의 중요한 것을 놓칠 수 있습니다.

두 번째는 on duplicate key update입니다. "no-op"업데이트 문을 입력해야합니다.

insert into primary(col1, . . .) 
    select col1, . . . 
    from secondary 
    on duplicate key update col1 = col1; 

이것은 종종 가장 쉬운 방법입니다. 나는 두 개의 질의가 동시에 행을 삽입하는 경우이 경쟁 조건이 발생할 수 있다고 생각

insert into primary(col1, . . .) 
    select col1, . . . 
    from secondary 
    where not exists (select 1 from primary where primary.keycol = secondary.keycol); 

:

세 번째

join 또는 not exists 논리를하는 것입니다.

+0

감사합니다. 두 번째 방법은 모든 제안 중에서 제 목적에 가장 적합하다고 생각합니다. 좋은 것처럼 보이고 잘 작동했습니다. – user3081519

0

잘못된 방향으로 가고 있습니다. 다음과 같은 것을 원합니다 :

insert into primary 
(field1, field2, etc) 
select distinct field_a, field_b, etc 
from additional 
where whatever. 

where 절은 기존 레코드를 제외 할 지점입니다. 분명히 MySQL은 except 키워드를 지원하지 않으므로 다른 방법을 사용해야합니다. This link이 도움이 될 것입니다.

또한 primary에 자동 생성 된 기본 키가 있으면 데이터베이스에서 생성합니다. 추가에서 PK 필드를 무시하십시오. 여기

insert into primary(col1, . . .) 
    select col1, . . . 
    from secondary; 

이 오류를 방지하는 방법은 세 가지이다 : 당신이 고유 키가있는 경우

관련 문제