Możesz usunąć funkcję automatycznego zwiększania wartości klucza podstawowego tej kolumny, a następnie za każdym razem, gdy aktualizujesz tę kolumnę, uruchom zapytanie, które policzy wszystkie wiersze w tabeli, a następnie uruchom pętlę, która iteruje przez tę liczbę wierszy, wstawiając każdą wartość do odpowiedni wiersz i na koniec uruchom zapytanie, wstawiając nowy wiersz z wartością w tej kolumnie będącą całkowitą liczbą wierszy plus jeden. To zadziała bezbłędnie i jest najbardziej absolutnym rozwiązaniem dla kogoś, kto próbuje osiągnąć to, kim jesteś. Oto przykład kodu, którego możesz użyć dla funkcji:
$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')");
Tutaj utworzyłem tablicę asocjacyjną, którą dołączyłem do kolumny rang z zapytaniem w zapytaniu wybierającym, co dało każdemu wierszowi wartość rangi zaczynającą się od 1. Następnie wykonałem iterację po tablicy asocjacyjnej.
Inną opcją byłoby pobranie liczby wierszy, uruchomienie podstawowego zapytania wybierającego, pobranie tablicy asocjacyjnej i wykonanie iteracji w ten sam sposób, ale z dodaną zmienną, która aktualizuje się w każdej iteracji. Jest to mniej elastyczne, ale da to samo.
$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')");