0

この小さなMySQLデータベーステーブルと単純な構造で相互作用するPHPページがあります。ID、、NameAddressフィールドです。ID主キーです。

+------+------------+-------------+
|  ID  |   Name     |   Country   |
|______|____________|_____________|
| E001 |  Stephen   |   America   |
| E002 |  John      |   Britain   |
| E003 |  Kate      |   Canada    |
| E004 |  Carlos    |   Spain     |
| E005 |  James     |   Australia |
|______|____________|_____________|

E003でレコードを削除すると、次のようになります。

+------+------------+-------------+
|  ID  |   Name     |   Country   |
|______|____________|_____________|
| E001 |  Stephen   |   America   |
| E002 |  John      |   Britain   |
| E004 |  Carlos    |   Spain     |
| E005 |  James     |   Australia |
|______|____________|_____________|

E002E004の間にギャップが表示されます。

そのギャップを埋める方法はありますか?このような

+------+------------+-------------+
|  ID  |   Name     |   Country   |
|______|____________|_____________|
| E001 |  Stephen   |   America   |
| E002 |  John      |   Britain   |
| E003 |  Carlos    |   Spain     |
| E004 |  James     |   Australia |
|______|____________|_____________|

E004を持っていた以前のレコードは、 E003の代わりになります。以前のE005は番号E004などを取得します。レコードのように一歩後退します。

これをプログラムで行う方法はありますか?

4

3 に答える 3

1

それらに番号を付け直す必要がある理由はありますか?キー値は実際には重要ではありません。その場合(つまり、外部目的で使用される場合)、外部キーをテーブルの通常の列にし、主キーを自動インクリメント整数フィールドにすることを検討してください。これを行ったとしても、おそらくキーの番号を付け直すべきではありません。つまり、すべての外部依存関係も更新する必要があります。それをすることにはあまり価値がありません。

しかし、あなたがしなければならないなら...

キーが自動インクリメント(本来あるべき)である場合、これを行うことができます:

ALTER TABLE MyTable DROP ID;
ALTER TABLE MyTable ADD COLUMN ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST;

そうでない場合は、いくつかのことができますが、最も簡単なのは、変数を使用してカウンターとして機能することです。これを簡単にするために、文字列の主キーを使用せず、代わりにプレーンな数値の主キーを使用してください。

SET @id = 0;

UPDATE MyTable
SET ID = (@id := @id + 1)
ORDER BY ID;
于 2012-09-18T04:10:07.020 に答える
1

データベースでは、テーブルIDは主キーであり、英数字です。

私はそうは思わないので、テーブルの主キーを再配置するための良い方法です。他のテーブルとの関係はすべて台無しになります。

文字列の代わりに数値の主キーを使用してみてください。

数値の主キーを使用する場合は、自動増分を使用して主キー列を削除して再作成することにより、それらを再配置できます。

于 2012-09-18T04:12:28.337 に答える
0

あなたのIDフィールドはフィールドではないので、 integer1つのクエリだけでそれを行うことはできず、ギャップの後にすべてのレコードをループしてIDフィールドを更新する必要があります。

しかし、より良い方法は、IDファイルされたタイプを変更して符号なし整数を自動インクリメントしID、ギャップが等しくなる前の最後を知ることによって、gID次のようなクエリを実行することです。

UPDATE table_name SET `ID` = (`ID` - 1) WHERE `ID` > gID;

次に、auto_increment値を更新する必要があります。

ALTER TABLE `table_name` AUTO_INCREMENT = (SELEC `ID` FROM `table_name` ORDER BY `ID` DESC LIMIT 1);

フィールド内のすべてのレコードにID共通の文字「E」があるため、この文字を削除してフィールドタイプを次のように変更できる場合があります。AUTO INCREMENT UNSIGNED INTEGER

于 2012-09-18T04:21:07.970 に答える