2015-01-23 2 views
0

간단한 질문을 드려 죄송합니다. 100 만 행을 가진 데이터베이스의 일부 필드를 번역하고 싶습니다. 필드 1 | | 그래서 내가하고 싶은 것은 4PHP mysql 모든 필드 업데이트

초기 테이블 필드 ID 필드에 기록되는 필드 1을 읽고 수행하는 기능을 번역하고 3 각각 필드 2 개의 요구를 필드에 기입 할 입니다 필드 2 | 필드 3 | 필드 4 |
1 | 사과 | 배 | 빈 | 빈 |
2 | 바나나 | 파인애플 | 빈 | 빈 |

최종 결과 테이블 번역 (사과) - 야 블로 코

id 필드 | 필드 1 | 필드 2 | 필드 3 | 필드 4 |
1 | 사과 | 배 | yablogo | grusha |
2 | 바나나 | 파인애플 | 바나나 | 아나나 |

이미 변환 기능이 있습니다. 질문은 수행 방법이 모두 1 백만 행에 대해 입니다. 루프를 올바르게 만드는 법? (데이터 일부가 제거됨에 따라 일부 ID가 누락되었습니다.)

미리 감사드립니다.

+0

엄청난 기념비적 인 작업. 어떤 API를 사용하고 있습니까? –

+1

루프를 구성하는 방법 (그렇지 않은 경우) 곧바로 "100 만 줄"전체를 루프에서 RBAR (행을 고민하는 행)으로 처리 할 수 ​​있도록 ... 아니오, 나는 이것을 다음과 같이 분류하지 않을 것입니다. 사소한 질문. (저는 다른 질문에 답하기를 좋아합니다. 새로운 번역 테이블을로드하고 전체 집합에 대해 업데이트 작업을 수행하는 방법에 대해 한 번 생각해보십시오.) (+ 나는 최고의 Dr.Evil 가장을 사용하고 싶습니다. , 내 입가에 핑키 손가락으로 "백만 줄"이라고 말하십시오.) – spencer7593

+0

* ... 꽤 많이 * - @ spencer7593 –

답변

0

"루프를 구성"하고 행 단위로 처리하는 것이 아니라 규범적인 패턴은 단일 명령문에서 연산을 수행하는 것입니다.

내가 번역 테이블을 채우는 것 :

CREATE TABLE my_translation 
(old_word VARCHAR(100) NOT NULL PRIMARY KEY 
, new_word VARCHAR(100) 
) Engine=InnoDB; 
INSERT INTO my_translation (old_word, new_word) VALUES 
('apple' ,'yablogo') 
,('pear'  ,'grush') 
,('banana' ,'banan') 
,('pineapple','ananas); 

그런 다음 갱신을한다. 까다로운 부분은 일치하는 항목이없는 경우 field_3field_4을 수정하지 않고 그대로 둡니다.

UPDATE my_table t 
    LEFT 
    JOIN my_translation c3 
     ON c3.old_word = t.field_1 
    LEFT 
    JOIN my_translation c4 
     ON c4.old_word = t.field_2 
    SET t.field_3 = IF(c3.old_word IS NULL,t.field_3,c3.new_word) 
    , t.field_4 = IF(c4.old_word IS NULL,t.field_4,c4.new_word) 

참고 :이 일회성 작업 인 경우, 나는 자리에 새 테이블을 넣어, 외래 키 참조를 새로운 테이블에 대한 INSERT로이 일을하고 테이블 이름을 교환하고 변경하는 것이 좋습니다 오래 된 테이블.

+0

방법이 약은 것 그것은 작동합니까? $ data = mysql_query ("SELECT * FROM DB_Table); while ($ result = mysql_fetch_array ($ data)) { $ id = $ result [ 'field_id']; $ field1 = $ 결과 [ 'field1']; $ insert1 = 번역 ($ field1); \t는 mysql_query ("INSERT INTO DB_Table (FIELD3) \t \t \t \t VALUES ('$의 insert1')"); } – migrant

+0

@migrant : ACCKKK !!! 2015 년입니다. mysqli와'PDO'라는 두 가지 적합한 인터페이스가 존재할 때 왜 우리는 여전히 새로운 개발을 위해 더 이상 사용되지 않는'mysql' 인터페이스를 사용하고 있습니다. 왜 SQL 인젝션에 취약한 코드를 작성하고 있습니까? 아니, 그건 효과가 없을거야. 고유 키에 의해 갱신 될 행을 식별하는 술어 (WHERE 절)가있는 UPDATE 문이 필요합니다 ...'WHERE t.field_id = 42' – spencer7593

+0

당신은 절대적으로 옳습니다. 나는 너무 어리 석다. – migrant