如何完全重写 SQL 索引?

How do I fully rewrite the SQL index?

如果这是一个非常简单的问题,我感到非常抱歉。这真是一个奇怪的案例,我什至不知道如何在 google 中编写它。我就是做不到。我将描述情况和我想做什么 - 我不知道如何将其作为问题...

情况是这样的。我有一个 mySQL table: service_logs。我将 log_id 作为主键并设置了 AUTO_INCREMENT。因此,那里的所有各种日志都有 log_id 1、2、3、4、5 等各种数据。但纵观历史,许多个人日志都被删除了。所以现在我有: log_id1:内容 log_id2:内容 log_id10:内容 log_id11:内容 log_id40:内容 等等。

我想填补其中的空白。我想要条目 nr。 10 重新分配了第 3 个数字,然后是条目 nr。 11 分配给第 4 个数字,依此类推。我不想有空隙。

是的,我知道这很愚蠢,不应该这样做。我只有一个朋友需要这些,他的一些 Excel 东西没有间隙:/

是的,这是个坏主意,没有必要,因为您可以随时添加 row_number 以获得您想要的结果以将其导出。

话虽如此。

  • 您可以删除 auto_increment 和主键
  • 重新编号列
  • 添加自增和主键
  • 并设置“正确”的号码

当时必须清楚,服务器

不应运行采取进一步行动

如果你只想要 consquitove 数字,你也可以选择 toe "make a seciond" log table with row_numbers in it, it is the sample CREATE TABLE log2

CREATE TABLe log(log_id int PRIMARY KEY AUTO_INCREMENT)
ALTER TABLE log MODIFY log_id INT ;
ALTER TABLE log DROP PRIMARY KEY;
INSERT INTO log VALUES (1),(2),(5),(10)
CREATE TABLE log2 SELECT ROW_NUMBER() OVER(ORDER BY log_id ASC) log_id,'abs' FROm log
UPDATE log
JOIN (SELECT @rank := 0) r
SET log_id=@rank:=@rank+1;
SELECT * FROM log
| log_id |
| -----: |
|      1 |
|      2 |
|      3 |
|      4 |
ALTER TABLE log MODIFY log_id INT  PRIMARY KEY AUTO_INCREMENT;
 SELECT @max := MAX(log_id)+ 1 FROM log;

  PREPARE stmt FROM 'ALTER TABLE log AUTO_INCREMENT = ?';
  EXECUTE stmt USING @max;

  DEALLOCATE PREPARE stmt;
| @max := MAX(log_id)+ 1 |
| ---------------------: |
|                      5 |
SELECT * FROM log2
log_id | abs
-----: | :--
     1 | abs
     2 | abs
     3 | abs
     4 | abs

db<>fiddle here