如何完全重写 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
如果这是一个非常简单的问题,我感到非常抱歉。这真是一个奇怪的案例,我什至不知道如何在 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