表中的订单ID

时间:2014-03-23 01:28:04

标签: mysql sql

是否可以让phpMyAdmin重新排列表的ID? 就像我得到1, 2, 3, 5, 6, ... PMA使它成为1, 2, 3, 4, 5, 6, ..

由于

3 个答案:

答案 0 :(得分:2)

我能想到重新编号数据的最好方法是使用auto_increment。假设您要使用无序/多空ID列t重新排序表id

CREATE TABLE `t` ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, ... );

第一步是创建一个新编号,并将每个现有ID与从1开始计数的新ID相关联。

-- this could be a temporary table
CREATE TABLE `new_t_ids` ( 
    new_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    current_id INT UNSIGNED NOT NULL 
);
INSERT INTO new_t_ids (current_id) SELECT id FROM t ORDER BY id ASC;

现在我们可以更新t

UPDATE t  JOIN new_t_ids ON t.id = new_t_ids.current_id  SET t.id = new_id;

最后我们设置了auto_increment。这最终变得过于棘手,因为ALTER不能直接设置为可变,但是无论如何都要在stackoverlow中展示一个好的模式(仅供参考,I had to look it up

SET @next_id  = ( SELECT MAX(ID) + 1 from t );
set @s = CONCAT("alter table t auto_increment = ", @next_id);
prepare stmt from @s;
execute stmt;
deallocate prepare stmt;

现在你的ID都从1开始重新编号。

我们可以将new_t_ids表留下来作为参考,或者

DROP TABLE new_t_ids;

有人说,这是一个坏主意。这些数字之间不得有间隙。我最担心的是,如果有任何与此数据相关的内容并且您的外键未被正确定义,那么您最终将破坏所有这些关联。

此外,如果您在线上对此表格进行此操作,则您需要将其锁定,以便在您工作时内容不会发生变化。更好的是让数据库停止服务。

所以我的推荐是试图放弃你人类对数据在计算机中应该如何看待的观点:)一般而言,孔比关系数据破坏要好得多。

答案 1 :(得分:0)

SELECT t.*, 
       @rownum := @rownum + 1 AS rank
  FROM YOUR_TABLE t, 
       (SELECT @rownum := 0) r

答案 2 :(得分:0)

如果他们经常更改,他们就不是真正的ID。想象一下,如果每次有人死亡,您的社会安全号码或信用卡号码都会改变。