我正在尝试用php/joomla中的函数重新索引一个表…它什么都不做。我也不能在一个字符串中生成整个slq命令集。
function ReNumberID($TABLENAME ,$COLUMNNAME) {
$sql = "set @a=0; " ;
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$db->setQuery($sql);
$db->execute();
$sql2 = "UPDATE `".$TABLENAME."` SET `".$COLUMNNAME."`=(@a:=@a+1); " ;
$db->setQuery($sql2);
$db->execute();
$sql3 = "SELECT * FROM `".$TABLENAME."` WHERE 1" ;
$db->setQuery($sql3);
$db->execute();
$newindexnumber = $db->getNumRows();
$newindexnumber++ ;
$sql4 = "ALTER TABLE `".$TABLENAME."` auto_increment = ".$newindexnumber." ;";
$db->setQuery($sql4);
$db->execute();
}
1条答案
按热度按时间vcirk6k61#
首先,我建议您检查每个查询,看看它们是否成功,以及受影响的行数。您当前正在调用
execute()
并相信确实发生了一些事情。谁知道你是否拼写错了一个列名,或者出现了特权错误之类的。第二,您应该确保应用更新的顺序是从当前的低id号升序。因为你很容易造成错误。下面是一个例子:
原因是id 1设置为1,然后id 5设置为2,这与第四行冲突。
这至少起了作用。如果我没有检查错误,我永远不会知道重复的密钥错误。
顺便说一下,您只需设置
ALTER TABLE ... AUTO_INCREMENT=0
,表格将自动将其调整为max(id)+1。但我有一个更强烈的建议:
**您无需重新编号自动递增键。**主键必须是唯一的,但不要求是连续的。
有间隙是正常的。当INSERT失败,或者您删除了一行,或者如果您插入但又回滚,就会发生这种情况。
如果对表中各行的主键重新编号,可能会出现问题。例如,如果您的应用程序在数据库外部进行通信,则外部系统可能会有一个旧id的实体记录。
示例:虐待用户1234骚扰其他用户,并将其本人禁止,其帐户关闭并删除。然后重新编号所有id并将1234分配给另一个新用户。第二天,一位律师出现并为你提供了针对用户1234的民事投诉。可怜的新用户因其他人的行为而受到指责。
我在我的书《SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming》中写到了这一点。关于这一错误的章节被称为“伪钥匙整洁怪胎”