基本的に、階層データを含むテーブルがあります。
したがって、id 列と、各子の親の id 列を指すロールアップ列があります。
このテーブルは、TableAdapter で GetData() を使用してデータベースからロードされ、テーブルの主キー autoincrementsseed は次を使用して設定されます。
SELECT IDENT_CURRENT('テーブル名') + 1
階層内に新しい子が作成されたら、同じ TableAdapter で Update() を呼び出します。
ほとんどの場合、これは完全に機能しますが、ContraintException Column 'id' is constrainted to be unique problem が発生する場合があり、新しい行が追加されたときにのみ発生するようです。
通常、autoincrementsseed と autoincrementstep を -1 に設定するだけで、id 列を更新するとデータベースから正しい値が取得されますが、ロールアップ列は主キーの値に依存するため、これは機能しません。
データベースに適用する前に、すべての変更をユーザーが全体として確認する必要があるため、新しい行をそれぞれライブで適用することもできません。
何か案は?
編集:他のソースからこのテーブルに他の変更が加えられていないことを言及する必要があるため、ここには同時実行の問題はありません。
別の編集: 今日、更新メソッドが呼び出される前にテーブルの値を確認したところ、新しい行が主キーで適切に並べ替えられていないことに問題があることに気付きました。
たとえば、行は 960,961,963,962 になり、962 が挿入されたときに、962 が既に存在するというエラーが発生しました。更新によって行が順番に挿入されていれば、これは起こらなかったでしょう。
テーブルが主キー順ではない行にインデックスを付けるのはなぜですか?