MySQL - 自动递减值

时间:2010-06-28 12:44:41

标签: php mysql database

假设我有一张表,就像那样(id是自动增量):

id | col1 | col2
1  | 'msg'| 'msg'
2  | 'lol'| 'lol2'
3  | 'xxx'| 'x'

现在,我想删除第2行,我得到类似这样的内容

id | col1 | col2
1  | 'msg'| 'msg'
3  | 'xxx'| 'x'

问题是,我想得到的是:

id | col1 | col2
1  | 'msg'| 'msg'
2  | 'xxx'| 'x'

我怎样才能以最简单的方式做到这一点(我对MySQL的了解非常差)?

5 个答案:

答案 0 :(得分:9)

你不应该那样做 请勿将自动递增的唯一标识符作为序号 单词“unique”意味着标识符应该粘贴到永远行。

这些数字与枚举之间没有联系 想象一下,您想按字母顺序选择记录。你珍贵的数字会去哪里? 您可能认为数据库不像有序列表。它不是以预定义顺序存储行的平面文件。它有完全不同的意识形态。数据库中的行没有任何订单。如果由ORDER BY条款明确设定,则仅在选定时间订购 此外,数据库应该为您搜索。因此,您可以通过过滤的行或不同的顺序来判断,此自动增量编号与实际行位置完全无关。

如果要枚举输出 - 它是表示层的工作。只需在PHP端添加一个计数器。

再次说明:这些数字应该能够识别某个记录。如果您更改此号码,则永远不会再找到您的记录。

以此网站为例。 Stack Overflow使用以下数字标识其问题:

  

stackoverflow.com/questions/ 3132439 / mysql-auto-decrementing-value

因此,假设您将此页面地址保存为书签。现在杰夫出现并重新编号整个数据库。您按下书签并登陆其他问题。整个网站将成为一个可怕的混乱。

请记住:重新编号唯一标识符是邪恶的!

答案 1 :(得分:0)

我认为没有办法直接这样做。也许你可以进行"update"操作。但是你必须在删除记录后的所有记录中执行此操作。这是非常糟糕的解决方案。

答案 2 :(得分:0)

如果要手动更改,为什么要使用自动增量?

答案 3 :(得分:0)

更改auto_increment列的值不是一个好习惯。但是,如果您确定要,则以下内容应该有所帮助。

如果您一次只删除一条记录,则可以使用交易:

START TRANSACTION;
DELETE FROM table1 WHERE id = 2;
UPDATE table1 SET id = id - 1 WHERE id > 2;
COMMIT;

但是,如果删除多条记录,则必须删除该列并重新添加。可能无法保证将行按以前的顺序排列。

ALTER TABLE table1 DROP id;
ALTER TABLE table1 ADD id INTEGER NOT NULL AUTO_INCREMENT;

此外,如果您的数据依赖于这些ID,则需要确保它已更新。

答案 4 :(得分:-1)

您可以像这样对整个表重新编号:

SET @r := 0;
UPDATE  mytable
SET     id = (@r := @r + 1)
ORDER BY
        id;