回答:
主キー列を削除して再作成できます。次に、すべてのIDを順番に再割り当てする必要があります。
ただし、これはほとんどの状況でおそらく悪い考えです。このテーブルへの外部キーを持つ他のテーブルがある場合、それは間違いなく機能しません。
この質問はかなり古いようですが、ここで検索を行った人に回答を投稿します。
SET @count = 0;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;
列が他のテーブルで外部キーとして使用されている場合は、それらのテーブルの外部キー関係のON UPDATE CASCADE
デフォルトの代わりに使用してくださいON UPDATE NO ACTION
。
さらに、AUTO_INCREMENT
カウントをリセットするために、次のステートメントをすぐに発行できます。
ALTER TABLE `users` AUTO_INCREMENT = 1;
MySQLの場合、値はにリセットされMAX(id) + 1
ます。
.
id` = @count:= @count + 1`のため、式の評価は事前定義された順序で発生するようにバインドされています。ドキュメントから:「右側の値は、リテラル値、値を格納する別の変数、またはスカラー値を生成する任意の正当な式である可能性があります」
ユーザーテーブルのIDをリセットするには、次のSQLクエリを使用します。これは、これが他のテーブルとの関係を台無しにするであろうと言われています。
ALTER TABLE `users` DROP `id`;
ALTER TABLE `users` AUTO_INCREMENT = 1;
ALTER TABLE `users` ADD `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
あなたは単にこのクエリを使用することができます
alter table abc auto_increment = 1;
phpmyadmin
注:これは、中央の行ではなく最後の行を削除した場合に機能します。
テーブルに移動->オペレーションメニューをクリック->テーブルオプションに移動-> AUTO_INCREMENTを、開始したい場所から変更します。
テーブルの自動インクリメントはその番号から始まります。
その列の主キーの自動インクリメント機能を削除してから、その列を更新するたびに、テーブル内のすべての行をカウントするクエリを事前に実行してから、その行カウントを反復するループを実行して、各値をそれぞれの行、最後に、列の値に合計行数に1を加えた新しい行を挿入するクエリを実行します。これは完璧に機能し、あなたが何であるかを達成しようとする誰かにとって最も絶対的な解決策です。以下は、関数に使用できるコードの例です。
$table_row_count = mysql_result(mysql_query("SELECT COUNT(`field_1`) FROM `table`"), 0);
$viewsrowsdata = mysql_query("
SELECT `rank`, `field1`, `field2`, `field3`, `field4`
FROM (SELECT (@rank:=@rank+1) as `rank`, `field1`, `field2`, `field3`, `field4`
FROM (SELECT * FROM `views`) a
CROSS JOIN (SELECT @rank:=0) b
ORDER BY rank ASC) c
");
while ($row = mysql_fetch_assoc($viewsrowsdata)) {
$data[] = $row;
}
foreach ($data as $row) {
$new_field_1 = (int)$row['rank'];
$old_field_1 = (int)$row['field1'];
mysql_query("UPDATE `table` SET `field_1` = $new_field_1 WHERE `field_1` = $old_field_1");
}
mysql_query("INSERT INTO `table` (`field1`, `field2`, `field3`, `field4`) VALUES ('$table_row_count' + 1, '$field_2_value', 'field_3_value', 'field_4_value')");
ここでは、selectクエリ内のクエリを使用してランク列に追加した連想配列を作成し、各行に1で始まるランク値を指定しました。次に、連想配列を繰り返し処理しました。
別のオプションは、行数を取得し、基本的な選択クエリを実行し、連想配列を取得し、同じ方法で繰り返しますが、各反復で更新される変数を追加することでした。これは柔軟性が低くなりますが、同じことを実現します。
$table_row_count = mysql_result(mysql_query("SELECT COUNT(`field_1`) FROM `table`"), 0);
$viewsrowsdata = mysql_query("SELECT * FROM `table`");
$updated_key = 0;
while ($row = mysql_fetch_assoc($viewsrowsdata)) {
$data[] = $row;
}
foreach ($data as $row) {
$updated_key = $updated_key + 1;
mysql_query("UPDATE `table` SET `field_1` = '$updated_key' WHERE `field_1` = '$row['field_1']'");
}
mysql_query("INSERT INTO `table` (`field1`, `field2`, `field3`, `field4`) VALUES ('$table_row_count' + 1, '$field_2_value', 'field_3_value', 'field_4_value')");
InnoDBの場合、これを実行します(これにより、テーブルからすべてのレコードが削除され、最初にベイクカップが作成されます)。
SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS ;
SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION ;
SET NAMES utf8 ;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 ;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 ;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' ;
SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 ;
/* ================================================= */
drop table tablename;
CREATE TABLE `tablename` (
table structure here!
) ENGINE=InnoDB AUTO_INCREMENT= ai number to reset DEFAULT CHARSET= char set here;
/* ================================================= */
SET SQL_MODE=@OLD_SQL_MODE ;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS ;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS ;
SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT ;
SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS ;
SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION ;
SET SQL_NOTES=@OLD_SQL_NOTES ;
同じ疑問がありましたが、テーブルに変更を加えることができませんでした。IDが変数@countに設定された最大数を超えないことを確認して、次のように決定しました。
SET @count = 40000000;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;
SET @count = 0;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;
ALTER TABLE `users` AUTO_INCREMENT = 1;
解決策はかかりますが、安全であり、私のテーブルが別のテーブルのデータを含む外部キーを所有していたために必要でした。
私の意見では、row_orderという新しい列を作成します。次に、その列を並べ替えます。主キーの変更を受け入れません。例として、order列がbanner_positionの場合、次のようなことを行いました。これは、バナー位置列の削除、更新、作成用です。この関数を呼び出して、それぞれを並べ替えます。
public function updatePositions(){
$offers = Offer::select('banner_position')->orderBy('banner_position')->get();
$offersCount = Offer::max('banner_position');
$range = range(1, $offersCount);
$existingBannerPositions = [];
foreach($offers as $offer){
$existingBannerPositions[] = $offer->banner_position;
}
sort($existingBannerPositions);
foreach($existingBannerPositions as $key => $position){
$numbersLessThanPosition = range(1,$position);
$freshNumbersLessThanPosition = array_diff($numbersLessThanPosition, $existingBannerPositions);
if(count($freshNumbersLessThanPosition)>0) {
$existingBannerPositions[$key] = current($freshNumbersLessThanPosition);
Offer::where('banner_position',$position)->update(array('banner_position'=> current($freshNumbersLessThanPosition)));
}
}
}
また、数値IDを主キーとして使用しないようにすることもできます。テーブルに国の情報が含まれている場合は、国コードをプライマリIDとして使用できます。たとえば、記事が含まれている場合は、パーマリンクを使用できます。
単にランダムな値またはMD5値を使用することもできます。このすべてのオプションには、それ自体の利点があり、特にIT部門に利点があります。数値IDは簡単に列挙できます。