Изменить порядок /reset первичный ключ автоматического увеличения

У меня есть таблица MySQL с первичным ключом автоматического увеличения. Я удалил несколько строк в середине таблицы. Теперь у меня есть, например, что-то вроде этого в столбце ID: 12, 13, 14, 19, 20. Я удалил строки 15, 16, 17 и 18.

Я хочу переназначить/ reset/изменить порядок первичного ключа, чтобы я имел непрерывность, т.е. делал 19 a 15, 20 a 16 и т.д.

Как я могу это сделать?

Ответы

Ответ 1

Вы можете удалить столбец первичного ключа и заново создать его. Затем все идентификаторы должны быть переназначены по порядку.

Однако это, вероятно, плохая идея в большинстве ситуаций. Если у вас есть другие таблицы, которые имеют внешние ключи к этой таблице, то это определенно не сработает.

Ответ 2

Несмотря на то, что этот вопрос кажется довольно старым, опубликует ответ для тех, кто достигает здесь, поиска.

SET @count = 0;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;

Если столбец используется в качестве внешнего ключа в других таблицах, убедитесь, что вы используете ON UPDATE CASCADE вместо стандартного ON UPDATE NO ACTION для отношения внешнего ключа в этих таблицах.

Далее, чтобы reset подсчитать AUTO_INCREMENT, вы можете сразу же выпустить следующую инструкцию.

ALTER TABLE `users` AUTO_INCREMENT = 1;

Для MySQLs это будет reset значение MAX(id) + 1.

Ответ 3

Чтобы reset идентификаторы моей таблицы User, я использую следующий 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;

Ответ 4

Вы можете просто использовать этот запрос

alter table abc auto_increment = 1;

Ответ 5

SET  @num := 0;

UPDATE your_table SET id = @num := (@num+1);

ALTER TABLE your_table AUTO_INCREMENT =1;

Я думаю, что это сделает это

Ответ 6

Или, из PhpMyAdmin, удалите флаг "AutoIncrement", сохраните, установите его снова и сохраните. Это сбрасывает его.

Ответ 7

в phpmyadmin

note: это будет работать, если вы удалите последние строки не средними строками.

перейдите в таблицу → нажмите на меню операций → параметры таблицы goto → измените AUTO_INCREMENT на то, с которого вы хотите начать.

автоматический автозапуск таблицы начинается с этого.

попробуйте. введите описание изображения здесь

Ответ 8

SELECT * from 'user' ORDER BY 'user_id'; 

SET @count = 0;

UPDATE 'user'  SET 'user_id' = @count:= @count + 1;

ALTER TABLE 'user_id' AUTO_INCREMENT = 1;

если вы хотите order by

Ответ 9

Вы можете удалить функциональные возможности автоматического прироста первичного ключа этого столбца, а затем каждый раз, когда вы обновляете этот столбец, запустите запрос перед рукой, который будет считать все строки в таблице, затем запустите цикл, который выполняет итерацию через этот счетчик строк, вставляя каждый значение в соответствующую строку и, наконец, запустить запрос, вставляя новую строку со значением этого столбца, являющимся общим числом строк плюс один. Это будет работать безупречно и является самым абсолютным решением для тех, кто пытается выполнить то, что вы есть. Вот пример кода, который вы можете использовать для функции:

$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:[email protected]+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')");

Здесь я создал ассоциативный массив, который я добавил в столбец рангов с запросом в запросе выбора, который дал каждой строке значение ранга, начиная с 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')");

Ответ 10

для InnoDB, сделайте это (это приведет к удалению всех записей из таблицы, сначала сделайте bakcup):

SET @[email protected]@CHARACTER_SET_RESULTS ;
SET @[email protected]@COLLATION_CONNECTION ;
SET NAMES utf8 ;
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 ;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 ;
SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' ;
SET @[email protected]@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 [email protected]_SQL_MODE ;
SET [email protected]_FOREIGN_KEY_CHECKS ;
SET [email protected]_UNIQUE_CHECKS ;
SET [email protected]_CHARACTER_SET_CLIENT ;
SET [email protected]_CHARACTER_SET_RESULTS ;
SET [email protected]_COLLATION_CONNECTION ;
SET [email protected]_SQL_NOTES ;

Ответ 11

У меня были те же сомнения, но я не мог внести никаких изменений в таблицу, я решил сделать следующее, увидев, что мой идентификатор не превышает максимальное число, установленное в переменной @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;

Решение принимает, но оно безопасно, и это необходимо, потому что моя таблица имела внешние ключи с данными в другой таблице.

Ответ 12

Лучший выбор - изменить столбец и удалить атрибут auto_increment. Затем выпустите другой оператор alter и поместите auto_increment обратно в столбец. Это будет reset подсчет до max + 1 текущих строк и, таким образом, сохранить ссылки на внешние ключи обратно в эту таблицу, из других таблиц в вашей базе данных или любого другого использования ключа для этого столбца.

Ответ 13

Мое мнение состоит в том, чтобы создать новый столбец с именем row_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)));
        }
    }
}

Ответ 14

Это работает - fooobar.com/questions/11756/..., если вы столкнулись с проблемой "Код ошибки: 1265. Данные усечены для столбца" id "в строке 1"... Затем выполните следующее. Добавление игнорировать в запросе на обновление.

SET @count = 0;
set sql_mode = 'STRICT_ALL_TABLES';
UPDATE IGNORE web_keyword SET id = @count := (@count+1);

Ответ 15

Вы также можете просто избегать использования числовых идентификаторов в качестве Первичного ключа. Вы можете использовать коды стран в качестве основного идентификатора, если таблица содержит информацию о странах или вы можете использовать постоянные ссылки, если они хранят статьи, например.

Вы также можете просто использовать случайное значение или значение MD5. Все эти варианты имеют свои преимущества, особенно на ИТ-сек. числовые идентификаторы легко перечисляются.