0

一定量の要素までテーブルを埋めるプロシージャを作成しようとしています。

現時点で私が持っている

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つのフィールドしかありません。そのうちの1つは自動インクリメントされてプライマリであるidで、もう1つは入力しているprofile_nameです。

助けてくれてありがとう!

4

1 に答える 1

2
  • まず、貼り付けたコードを実行しようとすると、デリミタの問題が発生すると思います。プロシージャ宣言の区切り文字は、プロシージャ コードで使用するもの (ここでは ';') とは異なる必要があります。DELIMITER ステートメントを使用する必要があります。

  • プロシージャはスキーマに属しています。他のシーマからテーブルをクエリできるかどうかはわかりません (特に USE ステートメントなし)。

  • これは、データベースに、手順によってデータが入力されることを想定していないテーブルが含まれている場合にはお勧めできません。

  • 関係するテーブルの数が限られている場合は、テーブルごとに 1 つのプロシージャを定義する方がよいと思います。このように、テーブル名は各プロシージャ コードで明示的になり、準備済みステートメントの使用が回避されます。

  • 「金額」パラメーターに注意してください。INTの最大値を金額として渡すと、サーバーがリクエストを処理できると確信していますか?

  • WHILE条件では「<=」ではなく「<」を使用する必要があると思います

  • 多数の行を挿入する場合は、「グループ化された」挿入を実行するか、すべての行を含む一時テーブルを (たとえば、MEMORY エンジンを使用して) 生成し、一時テーブルのコンテンツを選択する一意の INSERT を実行すると、パフォーマンスが向上します。

于 2012-02-08T15:45:01.873 に答える