MSQL / MARIADB:如何在另一个列升序的基础上重置ID

时间:2018-12-01 12:14:34

标签: mysql mariadb

我有一个包含4列ID,PLZ(德国邮政编码),long和lat的表

CREATE TABLE `table` (
    `ID` INT(5) UNSIGNED NULL,
    `PLZ` INT(5) UNSIGNED NULL,
    `lat` INT(5) UNSIGNED NULL,
    `long` INT(5) UNSIGNED NULL
)
COLLATE='utf8'

当我使用INSERT添加邮政编码时,新的邮政编码将添加到ID最高的表格末尾。

enter image description here

这破坏了PLZ邮政编码的升序。
我现在想根据PLZ邮政编码的升序对ID进行重新排序。

enter image description here

它应该是 MySQL的一个命令
最好的方法是什么?

P.S。 我可以这样做:

SELECT RANK() Over (ORDER BY plz) As id , plz, long, lat FROM `table`;

enter image description here

这样,我创建了一个虚拟列。每次我需要此列时,都必须运行此查询。我想将查询结果保存在一个列中,即使我创建了一个新的“ idsorted”,也没问题。

但是随后又以另一种方式提出了问题:“我现在如何使用新的ID列更新我的真实列“ idnew”?”

我要一个mysql命令。

2 个答案:

答案 0 :(得分:0)

错误的方法。

如果PLZ是唯一的,则不需要id。摆脱id列,并使PLZ成为PRIMARY KEY。然后,您的问题就解决了。而且您的桌子较小。而且某些查询运行得更快。双赢。

此外,除非您指定SELECT,否则ORDER BY的输出没有排序 。即使更改了PK,您仍然需要ORDER BY PLZ

(已添加)

如果PLZ不是唯一的,则保留id,但不是取决于ID值以任何特定顺序排列,而 do 使用ORDER BY以所需的顺序获取输出。

(更多)

好的,PLZ不是唯一的。如果要查看PLZ排序的整个列表,请提出以下要求:

 ORDER BY PLZ

或者,要在每个邮政编码中保持一致的顺序,

 ORDER BY PLZ, ID

如果您还需要其他“顺序”,请有一列(或多列)定义顺序。不用担心ID。

答案 1 :(得分:-1)

如果我理解正确,则应将ID索引的排序顺序更改为升序。

例如:

CREATE TABLE t (
ID INT,
PLZ INT,
Long [your type] ,
Lat [your type],
INDEX ID_asc (ID ASC)

);