2011-01-31 3 views
1

동일한 구조 및 자동 증분 ID가있는 2 개의 테이블이 있고 하나에서 다른 행을 복사하려고합니다.자동 증분 ID가있는 식별자 테이블 간의 행 복사

테이블 A에서 테이블 B로 행을 복사하려고 시도하고 고유 ID가 이미 테이블 B에있는 것과 충돌하면 단순히 복사하려는 행의 ID를 설정하고 싶습니다. 다음 값은 자동 증가 카운터입니다.

그러나 이것은 나를 위해 놀랍게도 어려움을 증명합니다. 여기에 내가 무엇을 가지고 :

"INSERT INTO tableB SELECT * FROM tableA WHERE tableA.id = '$id'ON DUPLICATE KEY UPDATE tableB.id = LAST_INSERT_ID(tableB.id)" 

그것은 나를 위해 일하지 않는 것. 또 다른 한가지는 키가 변경된 경우 새로운 키가 무엇인지 알려서 필자가 복사하는 관련 테이블의 행에 필요한 변경을 할 수 있도록해야한다는 것입니다.

누구든지 내가 잘못하고있는 것을 지적 할 수 있습니까?

여기에 비슷한 질문이 있다는 것을 알고 있습니다. 모두 읽었지만 여전히 이해할 수 없습니다.

편집 배경 정보 : 누군가 내 설치가 그것이 왜 그런지에 대해 물었 기 때문에 (그리고 그것이 차선책 인 경우 놀라지 않을 것입니다). 기본적으로 나는 문자열 매칭을 통해 DB에 다른 웹 사이트에서 물건을 긁어 모으고있다. 그러나 근근이 살아가는 과정의 까다로운 특성 때문에 최근에 긁힌 데이터에 대한 실시간 쿼리를 실행하고 싶지 않습니다. 그래서 기본적으로 나는 cron 스케쥴을 긁어내어 데이터 무결성을 매번 확인하고, 괜찮 으면 그것을 쿼리가 실행되는 "라이브"테이블에 복사합니다.

답변

1

확인 업데이트를 기반으로하면 하나의 표를 사용하기 만하면됩니다.

필드 'checked'기본값 추가 0 - 결정한 데이터를 복사하는 대신 적절한 필드를 2로 업데이트하면됩니다. 사용할 수없는 경우 1로 업데이트하십시오.

은 주기적으로 확인하고 즉시하지 않은 사람을 삭제할 때 여전히 1로 업데이트 확인 = 1

더 나은로 그 기록을 삭제합니다.

+0

그래, 내가 데이터베이스를 디자인 할 때 (처음으로 관계형 데이터베이스로 작업 할 때마다) 그 방법에 대해 생각해 보았다. 그리고 나는 수천 개의 레코드가있을 때 여분의 컬럼의 오버 헤드가 될 것이라고 생각했다. 데이터 베이스.만약 부울 컬럼이라면 추가 오버 헤드가 상당히 사소 할 것입니다. –

1

사용 :

ON DUPLICATE KEY UPDATE tableB.id = tableB.id 

다음 마지막으로 삽입 된 ID와 레코드의 ID를 반환해야합니다 - 그것 '삽입'과 참조 무결성 팁 정상을 유지하지 ... 비록

지금 - 당신이하려는 것은 나에게 조금 혼란스러워 보입니다. (더 자세히 설명해주십시오 - 당신에게 더 나은 대답을 줄 수 있습니다).

왜 a에서 b로 모든 레코드를 복사해야합니까? 이 테이블들은 '동일'한 것입니까?

+0

나는 그게 나를 위해 일하지 않는 것 같습니다. 지금은 테스트를 위해 tableA에 NULL 행이 여러 개 있습니다. 중복 키가있는 행을 복사하려고하면 tableB에서 아무 것도 변경되지 않습니다. 반면에 tableB에 대응이없는 행을 복사하는 것은 정상적으로 작동합니다. 내가 당신의 언급 이후로 나의 설치가 왜 그런지에 대한 약간의 코멘트와 함께 OP를 편집 할 것이다. –