2017-08-16 7 views
0

ビル番号を生成したいmySQLから自動インクリメント。私は列ID(主キー&自動インクリメント)を持っています。 Now Fromこの列のID私はBill Noを生成しています。ユーザーが要求したとおりです。問題は、間にあるレコードを削除すると、新しいレコードが入力されたときに削除されたIDをスキップしてはいけません。削除されたMySQL自動インクリメントスキップ番号

1001,1002,1003,1004などこれでレコードID 1002 &を削除した場合新しいレコードを入力すると、1002を新しいレコードに戻す方法を教えてください。

+0

あなたがこの – Strawberry

答えて

3

新しいレコードが

はいそれが必要に入って取得した時点で、削除されたIDをスキップするべきではありません。あなたは、決して設計されておらず、決して主張していないことを行うためにシステムに頼っているだけです。

AUTOINCREMENTは、あなたの「ビルノー」を生成するように設計されていません。永遠に増加する識別子を生成し、決して値を再利用することによって一意性を保証するように設計されています。そしてそれはまさにそれをやっています。

は、手動であなたが好きなロジック使って、「ビル・ノー」を生成し、別の列に格納することができます。しかし、値を再利用するのは変です。誰かに請求書を発行し、後でそのレコードを削除し、同じ番号の他の人に別の請求書を発行するとします。

一意性識別子を持つことが重要です。

+0

偉大な説明をしたいと思いれるいかなる状況は本当にありません。多くのpplは、データベースがauto_incrementを使用する理由とその重要性を知らない。 – Noob

+0

はい自動インクリメントは一意のデータに対してのみ行われることに同意します。私が意味することは、私は法案を作成するためにIDに完全に頼っていないということでした。請求書番号を生成するためにidプレフィックスロジックを既に適用しています。しかし、私はまた、私の請求書番号とID列の値を追加したい。私たちの業界では、それぞれの数を記録する必要があります。削除を実行した後に数字がスキップされると、それに対してペナルティが課せられます。あなたは、それが不可能な場合に私がどのようなロジックを適用すべきかを私に示唆することができますか? – SUN

+0

@SUN:業界にカスタム要件がある場合は、カスタムロジックを適用して請求番号を生成する必要があります。たぶん、既存のレコードを見て、最初の空の番号を見つける何らかの種類の関数ですか?どんなアプローチでも、パフォーマンス面では理想的ではありません。私は業界の要求がレコードを削除しないほうがよいと思っています。それは*おそらく*業界要件の実際の意図です。レコードが誤って発行された場合は、それを修正する2番目のレコードを発行します。削除しないでください。 – David

1

ビューの金融コントロールポイントは、請求書番号の損害賠償あなたの監査証跡を削除し、再利用することができることから、リスクに開いてあなたを残します。また、データベースの整合性の観点からは、他のテーブルのレコードが結合に間違って表示されるなど、予期しない結果につながるため、主キーの再利用は許可されません。あなたの主キー(excellent discussion of natural and surrogate primary keys)をnaturalisingへの影響があります。データベースは、プライマリキーの再利用を許可しないことによって、その参照整合性を保護している。確かに、@デビッドは彼の応答で述べているように、主キーの自動インクリメントの機能の一部がにあります

解決策には、財務面の請求書を削除しないでください。監査証跡があります。誤った請求書には、クレジットメモによる反対があります。レコードを「削除」して請求書番号を再利用すると、実際に削除するのではなく、アクティブまたは削除のフラグを立てるフィールドを使用して請求書番号を別々に増やすことをお勧めします。少なくともあなたの記録の完全性を維持するのに役立ちます。

関連する問題