2013-06-15 2 views
0

에 삽입 나는 두 개의 테이블이 있습니다 t1t2
- t2stuff (60.000 항목)라는 이름의 단 1 열이 있습니다.
- t1에는 stuff (비어 있음)을 포함하여 15 개의 열이 있습니다. t1에는 약 650.000 개의 항목이 있습니다.MySQL의 단일 컬럼 테이블> 다른 테이블

t2.stuff의 데이터를 t1.stuff에 가져 오려면 어떻게해야합니까? (단지 t1.stuff의 빈 필드에 t2.stuff의 데이터를 채우고 ids 또는 기타와 일치하는 것은 신경 쓰지 않아도됩니다.

가장 좋은 경우는 약 11 번이 쿼리를 실행하면, t1.stuff의 빈 필드가 남아 있지 않으므로 t1.stuff의 모든 필드가 채워집니다.

t1 :
|__a___|_b_|_c_|stuff|...|
|___308|foo|bar|_____|baz|
|___312|foo|bar|_____|baz|
...
|655578|foo|bar|_____|baz|

t2 :
|___stuff___|여기

는 테이블 모양을 예입니다 103,210 |some_info_1|
|some_info_2|
...
|some_info_n|

어쩌면 ...

UPDATE 여기

필요한 여러 단계 거기 솔루션 내가되어 있습니다 웬 누군가와 비슷한 문제가있는 경우를 대비하여 - 모든 크레딧은 사용자에게 누들 글로우에게 올바른 방향으로 나를 가리키게합니다. 그래서 여기에 우리가 간다 :

  1. 이 autoincrementing 번호로 채워 질문에 테이블에 새 열을 추가 ALTER TABLE t1 ADD COLUMN new_column INTEGER UNIQUE AUTO_INCREMENT;

  2. (이 코드에 오류를 방지하기 위해, 내 기본 키에 alter table t1 auto_increment = 1 및 임시 사용하지 autoincrementing 설정)
  3. t2에 대해 동일한 작업을 수행 했습니까? CREATE TABLE t2 (id INTEGER PRIMARY KEY AUTO_INCREMENT,t2_data_column VARCHAR(255)); < - 여러분의 필요에

    을 수를 조정하여 데이터를 가져옵니다 : 이미 두 번째 테이블이없는 경우, 당신은 이런 식으로 뭔가를 할 수
    LOAD DATA LOCAL INFILE 'path_on_your_server/data_file.csv'
    INTO TABLE t2
    LINES TERMINATED BY '\r\n' < - 조정 당신의 LINEBREAK에 당신이 할 수있는 INNER JOINt1을, 당신은에 맞게 뭔가를 이제
    (t2_data_column)

  4. 필요 다음을 수행하여: t1
    UPDATE t1 AS s
    JOIN t2 AS t ON t.id=s.new_column
    SET s.stuff=t.t2_data_column; <에 t2에서 데이터를 추가 - stuff I가 데이터를 가져 싶어 t1에서 열였다.
    DROP TABLE t2;
    ALTER TABLE t1 DROP COLUMN new_column;
    가 다시 기본 키에 자동 증가를 사용하도록 설정하고 이전에 하나를 사용하는 경우, 새 행에 필요한 숫자로 설정 엉망

  5. 깔끔한.

이제 끝났습니다.

추가 참고 사항 : 나는 데이터를 오프라인으로 조정하고이 방법으로 필요한 650.000 개 항목을 가져 오기로 결정했습니다. 초기 질문에 넣은 60.000만으로 수행하는 것이 아닙니다. 그러나 원하는 수의 데이터로 원하는 수의 데이터로 처리 할 수 ​​있습니다.

답변

1

INSERT 문은 테이블에 새 행을 만들 수 있습니다 희망이

 INSERT INTO t1 (stuff) 
    SELECT DISTINCT stuff FROM t2 

보십시오. 당신은 통근 스크립트 언어

을 사용하고있는 기존 행

그렇게하는 쉬운 방법을에 UPDATE가 필요합니다; 여기 rebol 예제입니다

; 당신이 softinnov에서 mysql 라이브러리를 사용한다는 것을 암시하십시오.

; 오픈 MySQL은 : // 사용자 : 패스 @ MySQL의

삽입 DB {T1로부터 선택한 *}

A_

데시벨 T1의 행에 대한 고유 키의 이름 t1rows :

삽입 DB DB 복사

t2rows {* T2에서 선택} 복사

DB를

foreach 행 t1rows [

insert db [{update t1 set t1.stuff =? 여기서 t1. a_ =?} t2rows/1/1 row/1]

꼬리? 다음 t2rows [

t2rows: head t2rows 

]

t2rows: next t2rows 

]

]

0

죄송합니다. 예제의 서식과 변수에 여전히 어려움이 있습니다.

+0

Puh, 정말 답을 이해하려고 노력했지만 아주 잘 따를 수는 없습니다. 나는 지금까지 데이터베이스 조작을 위해 phpmyadmin을 사용했다 ...). t1에서 행의 고유 키가 무슨 뜻입니까? 각 행의 기본 키를 의미하는 경우 자동 증가 숫자는 'a'열에 넣습니다. (밑줄은 그래픽에서 "아무것도"(공백)을 나타냄). 이 값들은 때때로'1','2' 등으로 시작하는 것이 아닙니다. 때때로 많은 행을 제거해야하기 때문입니다. 't2'는 이와 같은 것을 가지고 있지 않습니다. 't2' 데이터는 csv 파일에서 가져온 순수 텍스트를 포함합니다. –

+0

예, 기본 키는 고유 키이므로 a__ 대신 위의 명령문에서 a를 사용하여 각 행에 대해 보류를 얻을 수 있습니다. – sqlab

+0

커서를 사용하여 순수한 mysql을 사용하여 작업을 수행 할 수도 있지만 이게 더 어렵게 될 것이라고 생각합니다 – sqlab

0

내가 그것을

+0

감사 합니다만, 불행히도 다음과 같은 질문이 있습니다. '# 1064 - SQL 구문에 오류가 있습니다. 올바른 구문을 찾으려면 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. 'AS SELECT stuff FROM t2'at line 2 ' –

+0

@TinaMartinesz 코드를 편집했습니다. 지금 시도하십시오. –

+0

음, 이제 제가 얻었습니다 : # # 1062 - 키 'vkey''에 대한 중복 항목' ' –