-1

複数のテーブルを持つデータベースがあります。1 つのテーブルは「users」と呼ばれます。データの例は次のとおりです。

0 John Black
1 Joe Bloggs
2 Jane Doe

行で削除を実行するwhere id = 1と、データは次のようになります。

0 John Black
2 Jane Doe

データが次のようになるように、さらにレコードを変更して ID を減らすには、どのような SQL を記述しますか。

0 John Black
1 Jane Doe

注:ON UPDATE関連するデータを含む他のテーブルがあるため、たとえば、従業員の詳細には、ID 列を介してリンクされた住所と電話番号がありますが、 「カスケード」に設定されているため、これも変更されると思います

4

3 に答える 3

0

IDを変更しないでください。これは、誰かが銀行を離れるたびに銀行が口座番号を変更するようなものです。ここでは、問題が発生する余地が多すぎます。

あなたがやろうとしていることに代わるものは、sort_order列を持ち、それ自体を修正することです。削除があるたびに、UserIDASCに基づくMSSQL関数RANK関数のmysqlバージョンを使用して列を更新するトリガーがあります。

これにより、テーブルリンクを壊すことなく、同じ望ましい出力が得られます。

よろしく、

マーカス

于 2012-11-21T17:19:06.843 に答える
0

本当にしたい場合は、次のことができます。

  1. レコードを削除するトリガーを書く
  2. 削除される ID よりも -1 だけ大きいすべての ID を更新します
  3. 次に、このテーブルを参照するすべてのテーブルを更新します。

使用しているデータベースによっては、トランザクションの開始時に外部キー制約を削除し、最後に再度有効にする必要がある場合があります。


しかし、ここで間違った問題を解決している可能性があります。これは、本当の必要性ではなく、アナルネスから生じる悪い考えのように思えます。

于 2012-11-21T15:55:58.793 に答える
0

通常、整合性の理由からデータベースの ID を変更することはありません。データベースにギャップがあっても問題はありません。普通です!

行番号に基づいてレコードを検索することは想定されていません。ギャップが原因で問題が発生している場合は、アプリケーションの設計を再考する必要があります。

ただし、表示上の理由である場合は、Row_Numberを使用することをお勧めします

于 2012-11-21T15:45:29.800 に答える