我有一个表,使用主键(列名= caseid)存储支持案例的ID。
我现在已经有大约100,000个caseid,这个数字太大了。我希望以某种方式从较低的数字开始,例如1000.
如何通过不必删除/存档现有记录而不必将唯一的caseid更改为另一列(将其保留为主键列)来实现此类目标
答案 0 :(得分:0)
如何找到最低ID并从所有ID中减去其值?
然后,您将能够将ID重新设置为较低的数字
编辑:
这假设有未使用的ID并且没有与它们相关的recod
答案 1 :(得分:0)
要重置Primary Key
,您可以按照以下步骤操作:
创建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';
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;
对于引用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之前,请确保您的表tbl_cases_tmp
和所有引用都已正确更新。
删除tbl_cases
DROP table tbl_cases;
将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
*)仅包含明确字符的字母表。