MySQL |主键需要重置

MySQL | primary key needs resetting

我有一个 table,它使用主键(列名 = caseid)存储支持案例的 ID。

我现在大约有 100,000 个 caseid,这个数字太大了。我希望以某种方式从较小的数字开始,例如 1000。

我如何通过不必 delete/archive 现有记录并且不必将唯一 caseid 更改为另一列(将其作为主键列)来实现这样的事情

如何找到最低的 ID 并从所有 ID 中减去它的值?

然后您就可以将 id 重新设置为一个较小的数字

编辑:

这里假设有未使用的 id 并且没有相关的 recods

要重置 Primary Key,您可以按照以下步骤操作:

  1. 创建 temporary table,结构与 main table 相同。假设 table 名字是 tbl_cases

    CREATE TABLE tbl_cases_tmp LIKE tbl_cases;
    ALTER TABLE tbl_cases_tmp ADD old_caseid int NOT NULL DEFAULT '0';
    
  2. DUMPtbl_casestbl_cases_tmp 的所有数据。 caseid 将存储在 old_caseid 列中。

    INSERT INTO tbl_cases_tmp (name, summary, old_caseid)
    SELECT name, summary, caseid FROM tbl_cases;
    
  3. 对于任何其他 table 引用 tbl_cases。假设 tbl_reference

    UPDATE tbl_reference tr 
    JOIN tbl_cases_tmp tc
    ON tr.caseid = tc.old_caseid
    SET tr.caseid = tc.caseid;
    

在使用第 4 步和第 5 步之前,请确保您的 tables tbl_cases_tmp 和所有参考文献都已正确更新。

  1. 掉落tbl_cases

    DROP table tbl_cases;
    
  2. tbl_cases_tmp 重命名为 tbl_cases

    RENAME TABLE tbl_cases_tmp TO tbl_cases;
    

如果您的问题是传送 caseid,例如从客户通过 phone 到帮助台,您可能会考虑保留实际案例 ID,但在显示时更改 alphabet/set 数字。
例如。从十进制切换到十六进制,您将可以显示为四个 digits/characters 的值范围从 9999 增加到 65535(十六进制:ffff)。
现在考虑一组不同的数字,如 3479ACEFHJKLMNPRTUVWXY*,仅使用四个 digits/characters 即可显示的数字范围增加了很多。

<?php
echo getCode(234255), "\r\n"; // up until "here": four digits
echo getCode(234256), "\r\n"; // ok, now it's five
echo getCode(5100000), "\r\n"; // but stays five until > 5 millions

function toBase(/* positiv integer*/ $n, array $alphabet) {
    $retval = '';
    do {
        $retval = $alphabet[ $n%count($alphabet) ] . $retval;
        $n = intval( $n / count($alphabet) );
    }
    while( ($n=intval($n)) > 0);
    return $retval;
}

function getCode(/*int*/ $caseid) {
    static $alphabet = ['3','4','7','9','A','C','E','F','H','J','K','L','M','N','P','R','T','U','V','W','X','Y'];
    return toBase($caseid, $alphabet);
}

打印

YYYY
43333
YTYAA

*) 只包含明确字符的字母表。