2013-05-30 3 views
1

Мне нужно сгенерировать большое количество строк в одной таблице, к сожалению, один столбец необходимо создать на стороне приложения (PHP).Как эффективно генерировать большое количество строк

Так по существу Мне нужно создать что-то вроде этого:

id | encoded_val_based_on_id 
------------------------------- 
    1 | my_encode_func(1)  
------------------------------- 
    2 | my_encode_func(2)  
------------------------------- 
    3 | my_encode_func(3)  
------------------------------- 
    4 | my_encode_func(4)  

я предполагаю, что должен быть лучший способ затем генерировать N запросы, чтобы получить N идентификаторы, а затем обновить эти записи обратно с «encoded_val_based_on_id».

Кроме того, я хотел бы сохранить уникальный индекс на «encoded_val_based_on_id», который я не смог бы выполнить, поскольку я бы создал пустые строки, а затем заполнил их.

Я мог бы заблокировать таблицу, получить последний идентификатор, сгенерировать идентификаторы, увеличив в своем приложении + создание всех других вещей, вставить их и разблокировать таблицу. Я не думаю, что это правильный путь, но, по крайней мере, это можно сделать всего за 1 запрос (пакетная вставка), и я могу сохранить там уникальный индекс.

+0

Сгенерируйте его в текстовый файл, затем используйте 'LOAD DATA INFILE' с отключенными индексами. – zerkms

+0

Чтобы быть уверенным, что написать 'my_encode_func()' снова, поскольку хранимая функция MySQL не является вариантом ...? –

+0

@LukasEder На самом деле это было первое, что я пытался сделать, но для этой функции существует сложная логика, и MySQL немного ограничен с точки зрения того, что вы можете делать с пользовательскими функциями - просто SQL или C, и я не думаю что переписывание сложного алгоритма с PHP на C является единственным способом. –

ответ

1

До тех пор, пока вы не введете вставку, вы не знаете значения id (при условии автоматического увеличения).

Лучшим решением было бы иметь функцию для генерации этого значения, которое можно вызвать из SQL. Затем вы можете использовать триггер для вставки, чтобы взять идентификатор и вычислить значение. Однако из того, что вы говорите, это не реально.

Как InnoDB, так и MyISAM allows you имеют значения NULL в индексе UNIQUE.

Я думаю, что у меня возникнет соблазн вставить X строк с этим полем пустым/нулевым. Затем извлеките все строки, где это поле равно null, получая поля id. Затем вычислите значения из полей id и обновите строки.

Это, конечно, может означать несколько обновлений, которые довольно ужасно. Решением этого является сделать обновления, используя вместо этого INSERT ..... ON DUPLICATE KEY UPDATE. Поскольку вы укажете идентификатор, вы будете запускать обновление для каждой строки, и поскольку у вас могут быть тысячи строк в одном запросе на вставку, это можно сделать достаточно эффективно.

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