Mysql 在表中排序ID

Mysql 在表中排序ID,mysql,sql,Mysql,Sql,可以让phpMyAdmin重新排列表的ID吗? 比如当我得到1,2,3,5,6,…PMA使它1,2,3,4,5,6,… 谢谢如果它们经常更换,那么它们就不是真正的ID。想象一下,如果你的社会保险号码或信用卡号码在每次有人死亡时都发生了变化。我能想到的重新给数据编号的最佳方法是使用自动递增。假设您要对表t进行重新排序,其中包含无序/holey ID列ID CREATE TABLE `t` ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

可以让phpMyAdmin重新排列表的ID吗? 比如当我得到
1,2,3,5,6,…
PMA使它
1,2,3,4,5,6,…


谢谢

如果它们经常更换,那么它们就不是真正的ID。想象一下,如果你的社会保险号码或信用卡号码在每次有人死亡时都发生了变化。

我能想到的重新给数据编号的最佳方法是使用自动递增。假设您要对表
t
进行重新排序,其中包含无序/holey ID列
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;
最后,我们设置自动增量。这最终会变得非常棘手,因为ALTER不能直接设置为VARABLE,但无论如何都是在stackoverlow中展示的好模式(仅供参考)

现在您的ID都从1重新编号

-- 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;
我们可以将新的\u t\u id表留作参考,或者

DROP TABLE new_t_ids;
话虽如此,这是个坏主意。数字之间不必没有差距。我最担心的是,如果与此数据相关的任何内容以及外键的定义不正确,那么最终会破坏所有这些关联

此外,如果要对联机表执行此操作,则需要将其锁定,以便在工作时内容不会更改。最好是让数据库停止服务


因此,我的建议是,试着放弃你对数据在计算机中的外观的人性化观点:)一般来说,漏洞比破碎的关系数据更合适

您是希望更改表本身中的数据,还是仅仅更改PHPMyAdmin的视图?数据。我想这样做没有什么特别的原因。我只是更喜欢它。不要把它弄得乱七八糟。即使这样做行得通,它所做的只是在结果中添加一个任意的编号方案。实际上不会改变数据。我不想经常这样做。我现在就想这么做:-)ID还没有真正使用,所以需要编写一个一次性脚本来按顺序对它们进行编号。不过这是毫无意义的。那么PMA不提供这样的功能吗?@Philip为什么PMA提供这样的功能是个坏主意?您不应该更改自动增量ID。
DROP TABLE new_t_ids;