MySQL |主键需要重置

时间:2015-11-27 11:27:40

标签: php mysql primary-key auto-increment

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

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

如何通过不必删除/存档现有记录而不必将唯一的caseid更改为另一列(将其保留为主键列)来实现此类目标

3 个答案:

答案 0 :(得分:0)

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

然后,您将能够将ID重新设置为较低的数字

编辑:

这假设有未使用的ID并且没有与它们相关的recod

答案 1 :(得分:0)

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

  1. 创建temporary table,结构与main 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. 对于引用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. 在使用步骤4和5之前,请确保您的表tbl_cases_tmp和所有引用都已正确更新。

    1. 删除tbl_cases

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

      RENAME TABLE tbl_cases_tmp TO tbl_cases;
      

答案 2 :(得分:0)

如果你的问题是传送caseid,例如从客户通过电话到服务台,您可以考虑将实际案例ID保留为原样,但在显示时更改字母/数字组。
例如。从十进制切换到十六进制,您已经增加了可以显示为9999到65535(十六进制:ffff)的四位数/字符的值范围。
现在考虑一组不同的数字,如3479ACEFHJKLMNPRTUVWXY *,只能使用四位数/字符显示的数字范围会增加很多。

<?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

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