реверсивные идентификаторы в таблице sql - PullRequest
0 голосов
/ 15 декабря 2010

у меня есть таблица с основным идентификатором
1 симер
2 павана
3 глубоких
4 овцы
5 человек
я хочу отменить этот заказ
5 симер
4 павана
3 глубоких
2 овцы
1 человек

как я могу сделать это с помощью программирования или SQL? я не хочу использовать порядок в sql

Ответы [ 2 ]

2 голосов
/ 15 декабря 2010

Либо:

1) Выберите все строки, упорядоченные по id в порядке убывания, затем вставьте их в новую таблицу в порядке возрастания, и AUTO_INCREMENT этой таблицы назначит идентификаторы в обратном порядке.Теперь вы можете скопировать эти строки обратно в исходную таблицу с их новыми идентификаторами.

2) Выделите все строки, упорядоченные по id в порядке убывания, в программу, удалите их и заново вставьте их с новыми идентификаторами:

$sql = "SELECT id, name FROM table ORDER BY id DESC";
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
    $rows[] = $row;
}

//empty the table, to avoid primary key conflicts
mysql_query("TRUNCATE TABLE table");    

$i = 1;
foreach ($rows as $row) {
  mysql_query("INSERT INTO table (id, name) VALUES ($i, '" . mysql_real_escape_string($row['name']) . ")");
  $i++;
}
0 голосов
/ 15 декабря 2010

Я не хочу использовать заказ в sql

Но именно поэтому SQL предоставляет предложение ORDER BY.

Вы просто хотите изменить порядок текущих данных или хотите, чтобы ваша система назначала уменьшающиеся порядковые номера новым записям?

Первое было бы предпосылкой для второго, так что ...

UPDATE yourtable SET id=(4294967295-id);

Обратите внимание, что, хотя вы можете контролировать величину, на которую каждое новое значение автоинкремента отличается от предыдущего (указав auto_increment_increment), просто установка его в -1 не решит проблему, поскольку базовое значение, к которому применяется эта дельта, - это SELECT MAX (id) FROM yourtable - поэтому, даже если mysql позволил вам указать auto_increment_increment, равный -1, вы в конечном итоге получите дублирующиеся строки, поэтому вам нужно будет повторно реплицировать все ссылки на типы auto_increment в вашей схеме с прямыми целыми числами и использовать генератор последовательности вместо. Затем вам нужно будет переписать весь ваш код, чтобы использовать генератор последовательности вместо INSERT_ID () / mysql_insert_id ().

Не проще ли использовать ORDER BY?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...