0

ユーザー入力に基づいて特定の行と列の位置を更新するストアド プロシージャを作成しようとしています。私のテーブルには、漸進的な増分で名前を使用する約 100 の列があります。例 Page1、Page2、Page3、Page 4.... など。ユーザーが各ページの異なるバージョンを完了すると、データも段階的に更新する必要があります。

プロシージャが呼び出されると、ユーザーの行 (Page1 がキーで一意) を見つけて、ファイルのバージョンが最初の NULL 列に保存されている場所に情報を入れる必要があります。同様のアプリケーションでカーソルを使用するという話を見たことがありますが、これが適切な解決策であるかどうかはわかりません。

 ----------------------------------------------------
 |  Page1    |   Page2    |   Page3    |   Page4    |   
 ----------------------------------------------------
 |  /pg1.htm |   /pg2.htm |  /pg3.htm  |   NULL     |
 ----------------------------------------------------
 | /pg1.doc  |   /pg2.doc |   NULL     |   NULL     |
 ----------------------------------------------------
 | /pg1.pdf  |  NULL      |   NULL     |   NULL     |
 ----------------------------------------------------

呼び出されたときに1つのデータで毎回行を順次更新する手順が必要です。私の問題は、100 + IF ステートメントで制限するのではなく、これをスケーラブルにすることです。

私が作成した疑似コードは次のようになりますが、非常に非効率的です。

 FIND ROW that matches unique key
 LOOP Find_NULL
     IF Column2 == NULL
         UPDATE DATA HERE
     ELSE IF Column3 == NULL
         UPDATE DATA HERE
     ELSE IF Column4 == NULL
         UPDATE DATA HERE
     ELSE IF.... and on and on
 END LOOP Find_NULL

動的 SQL をサポートしていないと言われている MySQL を使用しています。次の NULL 列を格納するためにデータを調べたときに、変数を作成して変更しようとしましたが、これは機能しませんでした。

誰かが解決策やアドバイスを持っているなら、私はそれを感謝します.

前もって感謝します。

4

3 に答える 3

3

一見すると、データベースの設計が不十分なように見えます。

列に「Page1」、「Page2」...「Page 100」という名前を付けて、これらの列をほとんどの場合 NULL にしたくないでしょう。これは健全なデータベース設計に違反しています。データベースの正規化 (たとえば、第 1 正規形、第 2 正規形など) などの概念を確認することをお勧めします。

「ページ」という名前の列を作成すると、各行に 1 から 100 までの値と、ページに関連する情報が含まれる方がはるかによいと思います。この方法では、挿入/更新クエリを作成するときに、列名を動的につなぎ合わせる必要がありません。

于 2013-08-08T14:21:31.113 に答える
2

列を行に変換することをお勧めします。そうすれば、新しい行を挿入するだけで済み、はるかに効率的です。

テーブルには、値の順序を保持するためのシーケンス列が含まれます。

User,Seq,Val
1,1,/pg1.htm
1,2,/pg2.htm
1,3,/pg3.htm
2,1,/pg1.doc
2,2,/pg2.doc
3,1,/pg1.pdf
于 2013-08-08T14:23:19.503 に答える