ホーム
Top.Mail.Ru Yandeks.Metrika
フォーラム: "Bases";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];

ダウン

最初の無料IDを定義する 似ている枝を探す


S_King   (2001-12-04 10:18) [0]

ウィザードは、ストアドプロシージャで1番目の空き番号を決定する方法を支援しますか? 埋められたフィールド(1,2,4,5 ...)を持つテーブルがあります。 プロシージャは3を発行する必要があります。



Vadim   (2001-12-04 10:51) [1]

「不正に」のみ-行を反復処理するか、補助テーブルを使用します。 たぶん、タスクを異なるように設定できますか?



Владислав   (2001-12-04 10:57) [2]

選択を昇順でソートします。 すべてのレコードを調べて(すべてではありませんが、必要な番号が見つかるまで)、必要なものと使用しているものを見つけます。

一意の番号を取得する場合にのみ、これは最適なオプションではありません(最悪の場合もあります)。 2人のユーザーがこのような番号を同時に受信した場合に何が起こるか想像してみてください。



Yuvich   (2001-12-04 16:11) [3]

タスクがそのようなものである場合、Vladislavが説明する状況(「2人のユーザーが同時にそのような番号を取得するとどうなるか想像してください」)を排除するには、Vadimが提供するものを適用する必要があります(「補助テーブルの使用」)。

補助テーブルは、部屋の「穴」のリストを保持します。 穴が形成されると、このテーブルに挿入されました。 穴を埋める方法-この表から最小数を読み取り、この表からこの数を削除します。 すべてがトリガーで実行され、「ホールテーブル」をロックするときに、2人のユーザーが同じ番号を読み取ることはありません。 微積分法を使用する場合は、「ターゲットテーブル」全体をブロックする必要があります。これは、データを単に読み取ることができる他のユーザーにとっては悪いことです。



S_King   (2001-12-04 16:43) [4]

これはすべて理解できますが、循環する可能性があります
1から最大(Id)に保存 手順?

P / S:申し訳ありませんが、質問の言葉遣いが不十分かもしれません。



Vadim   (2001-12-04 16:52) [5]

可能ですが、「しかし」あります。2人のユーザーが同時に「サイクルを回す」ことを開始せず、同じ「ホール」でつまずかないという保証はありません(個人的にこの確率は非常に高いと推定しています)。 問題の条件により、これが許容される場合、パスに進みます。そうでない場合は、上記を参照してください。



dmitryK   (2001-12-04 17:12) [6]

SQLサーバーを使用する場合、SQLクエリでこのような問題を解決するのは論理的です。 このようなもの

最小(t1.ID)+ 1を選択します
tabXからt1左結合tabX t2 on t1.ID = t2.ID + 1
ここで、t2.IDはNULLです

ソフトウェアの過剰使用よりも高速に動作します。 また、削除されたレコードのジャーナルを使用してこれを実装することもできます。 レコードを(前に)削除するためのトリガーを切り、削除されたレコードのすべてのIDを別のテーブルに保存します。 この場合、新しいレコードを追加するとき、検索の時間の損失は事実上ありません(多数のレコードを追加するときは重要です)。 そして、2人のユーザーが同じIDをキャプチャしないように、1つのトランザクションでレコードを検索して追加します。



S_King   (2001-12-05 09:55) [7]

申し訳ありませんが、複数のユーザーについては尋ねませんでした...
しかし、1つのテーブルにループを作成する方法



dmitryK   (2001-12-05 10:49) [8]

今、私には理解できないことがあります。最小の無料IDを見つける方法を尋ねました。 これを行う方法をリクエストしました。 なぜ、あなたはサイクルを組織する必要があるのでしょうか?



S_King   (2001-12-05 11:21) [9]

クエリのテキストがどういうわけか理解できませんでしたが、同じテーブル用に作成することは可能ですか?



dmitryK   (2001-12-05 12:33) [10]

最小(t1.ID)+ 1を選択します
tabXからt1左結合tabX t2 on t1.ID = t2.ID + 1
ここで、t2.IDはNULLです

tabX-これはテーブルです。 彼女は自分と団結します。 その結果、IDを持つ2つの列を含むリクエストを取得します
1つ目はテーブル内のすべてのIDです。
2番目-ID + 1の場合はその値、そうでない場合はNULL

ここで、t2.IDがNULLである場合-2番目の列がNULLであるもののみを残します。 ID + 1は無料です。

min(t1.ID)+ 1-最小の空きID番号を返します。

SQL言語の説明をさらに詳しく読んでください。

このようなリクエストには1つの欠点しかありません。テーブルには少なくとも1つのレコードが必要であり、空きID番号は常に最小占有数より大きくなります。
しかし、それは別の話です...



S_King   (2001-12-05 16:32) [11]

理由はわかりませんが、このリクエストによりベースが死に至ることがあります。
consol、エキスパートで試してみた



ページ: 1 全枝

フォーラム: "Bases";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];

2階





メモリ:0.59 MB
時間:0.027 c
1-22238
T2
2001-12-16 07:29
2002.01.08
メニュー項目番号を決定する


1-22021
Socol
2001-12-18 08:54
2002.01.08
ファイルのアップロード!


1-22197
T2
2001-12-16 07:17
2002.01.08
プログラムでWindowsバスケットを無効にすることは可能ですか?


3-21953
Varik
2001-12-05 15:14
2002.01.08
プロレコード


1-21999

2001-12-15 02:02
2002.01.08
C ++またはDelphi





アフリカーンス語 アルバニア語 アラビア語 アルメニア語 アゼルバイジャン語 バスク ベラルーシ ブルガリア語 カタルーニャ語 中国語(簡体字) 中国語(繁体字) クロアチア語 チェコ語 デンマーク語 オランダ語 英語 エストニア語 フィリピン語 フィンランド語 フランス語
ガリシア語 ジョージアン ドイツ語 ギリシャ語 ハイチ語 ヘブライ語 ヒンディー語 ハンガリー語 アイスランド語 インドネシア語 アイリッシュ イタリア語 日本語 韓国語 ラトビア語 リトアニア マケドニア語 マレー語 マルタ語 ノルウェー語
ペルシア語 ポーランド語 ポルトガル語 ルーマニア語 ロシア語 セルビア スロバキア語 スロベニア語 スペイン語 スワヒリ語 スウェーデン語 タイ語 トルコ語 ウクライナ語 ウルドゥー語 ベトナム語 ウェールズ語 イディッシュ語 ベンガル語 ボスニア語
セブアノ語 エスペラント グジャラート語 ハウサ語 モン族 イボ ジャワ語 カンナダ語 クメール語 ラオ語 ラテン マオリ語 マラーティー語 モンゴル語 ネパール語 パンジャブ語 ソマリ タミル語 テルグ語 ヨルバ語
ズールー語
Английский Французский Немецкий Итальянский ポルトガル語 Русский Испанский