Заполните до определенного количества - PullRequest
0 голосов
/ 06 февраля 2012

Я пытаюсь создать процедуру, которая будет заполнять таблицу до определенного количества элементов.

На данный момент у меня есть

CREATE PROCEDURE PopulateTable(
    IN dbName           tinytext,
    IN tableName        tinytext,
    IN amount           INT)
BEGIN
    DECLARE current_amount INT DEFAULT 0;
    SET current_amount = SELECT COUNT(*) FROM dbName,'.',tableName;
    WHILE current_amount <= amount DO
        set @dll=CONCAT('INSERT INTO `',dbName,'`.`',tableName,'`(',
                        '`',tableName,'_name`) ',
                        'VALUES(\'',tableName,'_',current_amount,'\')');
        prepare stmt from @ddl;
        execute stmt;
        SET current_amount = current_amount + 1;
    END WHILE;
END;

Итак, что я пытаюсь сделать, когда пользователь вызовет процедуру, функция проверит и посмотрит, сколько текущих элементов существует, и заполнит оставшиеся элементы.

Первая проблема, с которой я столкнулся, заключается в том, что я не умею считать элементы, поэтому мой SELECT COUNT(*) FROM dbName,'.',tableName; не работает.

Я также хочу предложение, поскольку я в некотором роде новичок в базах данных, если то, что я делаю, правильно или есть лучший способ сделать это?

Также, если это поможет, в таблице, к которой я пытаюсь это сделать, есть только 2 поля, одно из которых id, которое автоматически увеличивается и является основным, а другое - profile_name, которое я заполняю.

Спасибо всем за помощь!

1 Ответ

2 голосов
/ 08 февраля 2012
  • Во-первых, я думаю, у вас возникнет проблема с разделителем, если вы попытаетесь выполнить вставленный код. Разделитель объявления процедуры должен отличаться от того, который вы используете в коде процедуры (здесь ';'). Вам нужно будет использовать оператор DELIMITER ;

  • Ваша процедура принадлежит схеме; Я не уверен, что вы можете запрашивать таблицы из других схем (особенно без оператора USE);

  • Это не очень хорошая идея, если ваша база данных содержит таблицы, которые не должны заполняться вашей процедурой;

  • Если у вас ограниченное количество соответствующих таблиц, я думаю, что будет лучше определить одну процедуру для каждой таблицы. Таким образом, имя таблицы будет явным в каждом коде процедуры, и это позволит избежать использования подготовленных операторов;

  • Будьте внимательны с параметром количества: вы уверены, что ваш сервер может обрабатывать запросы, если я передам максимальное значение для INT как сумму?

  • Я думаю, что вы должны использовать '<' вместо '<=' в вашем состоянии WHILE </p>

  • Если вы хотите вставить большое количество строк, вы получите лучшую производительность, выполняя «групповые» вставки или создавая временную таблицу (например, с механизмом MEMORY), содержащую все ваши строки и выполняя уникальную INSERT выбор содержимого вашей временной таблицы.

...