2015-01-23 5 views
0

Извините, задав тривиальный вопрос. Я хочу перевести некоторые поля моей базы данных, которые имеют миллион строк. Так что я хочу сделать, это читать поле 1 и выполнять функцию перевода и записать его в поле 3 и, соответственно, поле 2 должен быть написан в поле 4.php mysql обновить все поля

исходная таблица поле идентификатор | поле 1 | поле 2 | поле 3 | поле 4 |
1 | яблоко | груша | пустой | пустой |
2 | банан | ананас | пустой | пустой |

конечный результат таблицы перевода (яблоко) - ЯБЛОКО

поле ID | Поле 1 | 2 поля | Поле 3 | 4 поля |
1 | яблоко | груша | yablogo | grusha |
2 | банан | ананас | банан | ананас |

У меня уже есть функция перевода, вопрос заключается в том, как выполнить это на все миллион строк. Как правильно построить петлю? (конечно, некоторые идентификаторы отсутствуют, так как некоторые данные были удалены).

спасибо, что заблаговременно !!!

+0

Довольно монументальной задачей. Какой API вы используете? –

+1

Как построить цикл (для чего бы иначе было) простое обновление, поэтому весь «один миллион строк» ​​+ может быть обработан 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_3 и field_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) 

ПРИМЕЧАНИЕ: Если это выполняется один раз, я мог бы рассмотреть возможность сделать это как вставить в новую таблицу, а затем поменять местами имена таблиц и изменение внешнего ключа ссылки, чтобы поставить новую таблицу на месте старой таблицы.

+0

, как об этом будет он работает? $ data = mysql_query ("SELECT * FROM DB_Table); while ($ result = mysql_fetch_array ($ data)) { $ id = $ result ['field_id']; $ field1 = $ result ['field1']; $ insert1 = translate ($ field1); \t mysql_query ("INSERT INTO DB_Table (field3) \t \t \t \t VALUES ('$ insert1')"); } – migrant

+0

@migrant: ACCKKK !!! Это 2015 год. Почему мы * все еще используем устаревший интерфейс 'mysql' для новой разработки, когда доступны два подходящих интерфейса:' mysqli' и 'PDO'. И почему мы * все еще пишем код, который уязвим для SQL Injection? И нет, это не сработает. Вам понадобится инструкция UPDATE с предикатом (предложение WHERE), которое идентифицирует строку, которая будет обновляться с помощью уникального ключа ... 'WHERE t.field_id = 42' – spencer7593

+0

Вы абсолютно правы. Мне так глупо. – migrant

Смежные вопросы