MySQL |主键需要重置
MySQL | primary key needs resetting
我有一个 table,它使用主键(列名 = caseid)存储支持案例的 ID。
我现在大约有 100,000 个 caseid,这个数字太大了。我希望以某种方式从较小的数字开始,例如 1000。
我如何通过不必 delete/archive 现有记录并且不必将唯一 caseid 更改为另一列(将其作为主键列)来实现这样的事情
如何找到最低的 ID 并从所有 ID 中减去它的值?
然后您就可以将 id 重新设置为一个较小的数字
编辑:
这里假设有未使用的 id 并且没有相关的 recods
要重置 Primary Key
,您可以按照以下步骤操作:
创建 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';
DUMP
从 tbl_cases
到 tbl_cases_tmp
的所有数据。 caseid
将存储在 old_caseid
列中。
INSERT INTO tbl_cases_tmp (name, summary, old_caseid)
SELECT name, summary, caseid FROM tbl_cases;
对于任何其他 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
和所有参考文献都已正确更新。
掉落tbl_cases
DROP table tbl_cases;
将 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
*) 只包含明确字符的字母表。
我有一个 table,它使用主键(列名 = caseid)存储支持案例的 ID。
我现在大约有 100,000 个 caseid,这个数字太大了。我希望以某种方式从较小的数字开始,例如 1000。
我如何通过不必 delete/archive 现有记录并且不必将唯一 caseid 更改为另一列(将其作为主键列)来实现这样的事情
如何找到最低的 ID 并从所有 ID 中减去它的值?
然后您就可以将 id 重新设置为一个较小的数字
编辑:
这里假设有未使用的 id 并且没有相关的 recods
要重置 Primary Key
,您可以按照以下步骤操作:
创建
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';
DUMP
从tbl_cases
到tbl_cases_tmp
的所有数据。caseid
将存储在old_caseid
列中。INSERT INTO tbl_cases_tmp (name, summary, old_caseid) SELECT name, summary, caseid FROM tbl_cases;
对于任何其他 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
和所有参考文献都已正确更新。
掉落
tbl_cases
DROP table tbl_cases;
将
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
*) 只包含明确字符的字母表。