Joomla重新索引mysql表作为函数

时间:2014-05-15 00:55:45

标签: php mysql joomla joomla2.5

我想用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 个答案:

答案 0 :(得分:1)

首先,我建议您检查每个查询,看看它们是否成功,以及受影响的行数。您目前正在调用execute()并相信实际发生的事情。谁知道你拼写的列名是错误还是有特权错误或什么的。

其次,您应该确保从当前低ID号升序开始按顺序应用更新。因为您很容易导致错误。这是一个例子:

mysql> create table bar (id int primary key, x int) engine=myisam;
mysql> insert into bar (id) values (1), (5), (7), (2);
mysql> select * from bar;
+----+------+
| id | x    |
+----+------+
|  1 | NULL |
|  5 | NULL |
|  7 | NULL |
|  2 | NULL |
+----+------+
mysql> set @a := 0;
mysql> update bar set id = (@a:=@a+1);
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'

原因是id 1设置为1,然后id 5设置为2,与第4行冲突。

mysql> update bar set id = (@a:=@a+1) order by id;
Query OK, 3 rows affected (0.00 sec)
mysql> select * from bar;
+----+------+
| id | x    |
+----+------+
|  1 | NULL |
|  3 | NULL |
|  4 | NULL |
|  2 | NULL |
+----+------+

至少有效。如果我没有检查错误,我永远不会知道重复键错误。

顺便说一下,你可以设置ALTER TABLE ... AUTO_INCREMENT=0,表格会自动将其调整为最大(id)+1。


但这是我更强烈的建议:

您无需重新编号自动增量键。主键必须是唯一的,但不需要连续。

有差距是正常的。当INSERT失败,或者您删除一行,或者如果您插入但后滚回来时,就会发生这种情况。

如果重新编号整个表中行的主键,则会出现问题。例如,如果您的应用程序在数据库外部进行通信,则外部系统可能具有旧ID的实体记录。

示例:滥用用户1234骚扰其他用户并被禁止,他的帐户被关闭并删除。然后重新编号所有id并将1234分配给另一个新用户。第二天,律师出现并向您提供针对用户1234的民事投诉。这位贫穷的新用户被指责为其他人所做的事情。

我在我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming中写到了这一点。关于这个错误的章节叫做“Pseudokey Neat-Freak”。