假设我有一张表,就像那样(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的了解非常差)?
答案 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;