【问题标题】:How do I fully rewrite the SQL index?如何完全重写 SQL 索引?
【发布时间】:2021-09-13 00:46:55
【问题描述】:

如果这是一个非常简单的问题,我感到非常抱歉。这只是一个奇怪的案例,我什至无法弄清楚如何在谷歌中写出来。我就是不能。我将描述情况以及我想做什么 - 我不知道如何提出这个问题......

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

我想填补其中的空白。我想要条目 nr。 10 重新分配了第三个数字,然后输入 nr。 11 分配了第 4 个号码,依此类推。我不想在里面有空隙。

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

【问题讨论】:

    标签: sql url-rewriting key


    【解决方案1】:

    是的,这是一个坏主意,而且没有必要,因为您始终可以添加 row_number 来获得想要的结果以导出它。

    说了算。

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

    必须明确当时不应对服务器运行进一步的操作

    如果你只想要 consquitove numbers,你也可以选择 toe "make a seciond" log table,其中包含 row_numbers,它是示例 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 |腹肌 -----: | :-- 1 |腹肌 2 |腹肌 3 |腹肌 4 |腹肌

    db小提琴here

    【讨论】:

    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2015-06-30
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多