2010-12-15 3 views
0

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

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

+3

Почему? Зачем? Почему вы хотите изменить порядок первичного ключа ??? – Mchl

+0

Хороший вопрос .. –

+2

Почему вы не хотите использовать операцию ORDER BY? – Beaker

ответ

2

Либо:

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

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

$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

Ваш ответ правильно решает проблему, просто ждет какой-то другой подход, если он есть. –

0

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

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

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

Бывший будет предпосылкой для последнего так ....

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?

+0

извините, но я не понял ваш ответ :) –

+0

, но спасибо за ответ –

Смежные вопросы