2011-06-17 16 views
5

私のdbテーブルはこの写真のように見えます。自動インクリメントの "id"カラムの問題

最近私はdelete.phpページを作成しました。それが正常に動作しますが、登録ユーザーではなく、21

の24日のIDを取得する次のIは21日、ユーザーを削除したときに最初の空行に新たに登録されたユーザー情報を配置することは可能ですか? 、私の登録フォームで

(このような状況の第21回行で)新規ユーザーを登録すると、既存のユーザーの名前を書くことができ、登録後に彼らと友達になります。この友情のために、私は新たに登録されたユーザーと既存のユーザーのIDを関連付ける別のテーブルを持っています。

この目的のために、私は新しいユーザーのIDを取得するために登録中にmysql_insert_idを使用しています。しかし、nex登録プロセス中に21行目を削除した後、mysql_insert_idは私に21という数字を与えましたが、24行目に保存されました。新しいユーザーのためにテーブル21を関連付けます。私はこの問題

+0

あなたは 'mysql_insert_id()'を誤解しているかもしれません。挿入されたLAST IDを返します。それを繰り返し呼び出すと常に最後のものが返され、次のものは返されません。別の挿入が完了するまで、その値は変更されません。 –

答えて

2

MySQLのauto_increment列は内部的に数を維持して解決したい、と常にでも削除した後、それをインクリメントします。空白を埋める必要がある場合は、テーブル定義でauto_incrementキーワードを使用するのではなく、PHPで直接処理する必要があります。

あなたが維持するために、外部キー関係を持っている場合、難易度のすべての種類を引き起こす可能性があり、空の行IDを埋めるためにロールバックして、それは本当にお勧めできません。

auto_incrementは、SQL文を使用してリセットすることができますが、それは重複キーエラーが発生しますので、これはお勧めできません。コメントで説明したように、あなたのテーブル定義に追加する必要があり、あなたの外部キー関係を強制するために

-- Doing this will cause problems! 
ALTER table AUTO_INCREMENT=12345; 

EDIT

FOREIGN KEY (friendid) REFERENCES registration_table (id) ON DELETE SET NULL; 

正しいテーブルや列の名前を入力します。今、ユーザが登録から削除されると、彼らの友人関係は無効になります。別のユーザーと再関連付けする必要がある場合は、PHPで処理する必要があります。 mysql_insert_id()はもはや役に立ちません。あなたは友人と関連付けるために、削除した後に、データベースにまだ最も大きい番号のIDを検索する必要がある場合は

、以下を使用します。

SELECT MAX(id) FROM registration_table; 
+0

私はmysql_insert_idでそれを行うことができますか? –

+0

@Tural Teyyuboglu:mysql_insert_id()は、最後の挿入のIDを取得します。その値をインクリメントして保存すると、次回の挿入に再び使用できます。ただし、最後の挿入時に使用したIDはすでに分かっているため、これは不要です。 –

+0

@Tural Teyyubogluいいえ、mysql_insert_idは最後に使用されたIDだけを取得するためです。 –

3

自動インクリメントID列を使用すると、次のエントリが割り当てられる値は、エントリを削除することで減少しません。これは、オートインクリメントの列が使用されるものではありません。データベースエンジンは、新しい挿入時に常にその番号をインクリメントし、削除時にその番号を減らさない。

2

自動増分は、テーブルの一部として追跡されるシーケンスキーです。行を削除しても元に戻りません。

+1

私のアイデアを実現するために助けてください –

1

簡単にはありません。あなたができること(しかし、私はやっていることを示唆していません)は、現在占有されていない最も低い数字を決定するSQL関数を作成しています。または、削除されたIDのテーブルを作成し、そこから最小の番号を取得することもできます。または、これが最良のアイデアです。ギャップを無視し、データベースが正常であることを認識してください。

1

あなたがしたいことは、テーブルにuser_orderのような追加の列を追加することで達成できます。次に、挿入と削除を管理するコードを記述して、この列が常に隙間なく連続するようにします。

このようにして、auto_incrementカラムを使用したときに発生する問題を回避できます。

1

それは、AUTO_INCREMENT値をリセットすることをお勧めではないですが、あなたは本当にあなたができるので、それを行う必要がある場合:

ALTER TABLE mytable AUTO_INCREMENT = 1; 

実行このクエリをした後、すべて削除します。 Auto_increment値は1に設定されません。これにより、可能な限り自動的に最小値が設定されます。

+1

なぜそれはボットが良いと思いますか? –

+0

@Tural、table1とtable2をイメージしましょう。 table2にはtable1のforeighキーがあります。たとえば、table1から何かを削除した後、同じテーブルに新しい行を追加するとします。したがって、新しい行は削除された行と同じIDを取得します。しかし今、table2の行がtable1の新しい行を指している状況があります。以前この行は削除された行を指し、今度は新しい行を指します。ですから、これはOKです。 – Karolis

+0

@Tural、申し訳ありません、私の最後の文章では、これはOKではないと言いたいと思っていました。しかし、私はあなたが理解したと思う:) – Karolis

関連する問題