1

わかりました、これは説明するのが少し奇妙です、私は最善を尽くします.

バージョンの一部であるさまざまな操作のリストを含む、バージョンと呼ばれるテーブル ()がDBあります。SQL

たとえば、バージョン 1.0:

1. Insert XX

2. Delete YY

3. Insert XY

私のコードでは、特定のバージョンの操作を更新する必要がある場合があります。たとえば、位置 2. に new が必要だとInsert YXます

1. Insert XX

2. Insert YX

3. Delete YY

4. Insert XY

(これはまだバージョン 1.0 です)。

ご覧のとおり、バージョンを更新するたびに一部の操作の位置が変更されるため、最初の追跡が失われます。多数の更新の後、操作が最初と同じ場所にあることはほぼ不可能です。

だから、それは私の問題です。これらの列を個別に追跡する必要があります:

テーブル内に複数ある可能性があるため、 「 Insert XX 」の位置を探すクエリを作成できません。 Insert XX

私の質問は、SQL テーブル内の位置の変更を追跡するソリューションはありますか?

Java をプログラミング言語として、ORMLite をマッパーとして PostgreSQL を使用しています。

前もって感謝します。

4

3 に答える 3

3

行に一意のIDフィールドを使用し、注文にシーケンスフィールドを使用できます

  id seq val
  1  1   Insert XX  
  2  2   Delete YY
  3  3   Insert XY

新しいアイテムを pos 2 に追加すると (次の id(4) を取得し、更新 where seq >=2 を実行して seq=sql+1 を設定します)

  id seq val
  1  1   Insert XX  
  4  2   Insert YX
  2  3   Delete YY
  3  4   Insert XY
于 2013-04-30T13:16:04.943 に答える
3

DB で絶対に確認できないことの 1 つは、行の順序です。たとえば、次のようにします。

insert *A* into myTable ...
insert *B* into myTable ...

そして、

select * from myTable  

あなたはで終わる可能性があります

A
B

また

B
A

どちらも等しく有効です。あなたの場合、結果を並べ替えるという特定の目的を持つ列を追加することができます。通常は整数を使用し、それを displayOrder と呼びます。したがって、私の選択ステートメントは通常次のようになります。

select * from myTable order by displayOrder

これの 1 つの用途は、複数の会社から選択できるフォームです。一番上に欲しいものはアルファベット順で真ん中にあるので、会社名で注文できます。代わりに、displayOrder 列を使用します。

それが役立つことを願っています。

于 2013-04-30T13:20:46.870 に答える
1

バージョン番号、命令番号、およびシーケンス番号をリストした別の表はどうですか? より複雑になっていますが、必要なバージョンを再作成することもできます。さらに、メイン テーブルの seq 番号を書き換え続ける必要はありません。

Table Versions
     VersionID int,
     InstructionNum int,
     SeqNum int

ここで、VersionID は何らかのバージョン識別子です (文字列の場合もあります)。InstructionNum は命令のリスト (すでに持っています) を指し、シーケンス番号はそれらを実行する順序を示します。

このようにして、すべてのバージョンにはない特定のバージョンの手順を使用することもできます。

于 2013-04-30T13:31:28.290 に答える