【问题标题】:PHP/MySQL: Rebuild primary key fieldPHP/MySQL:重建主键字段
【发布时间】:2012-07-07 13:10:45
【问题描述】:

问题:

主键字段为'ID'

使用REPLACE INTO 命令将数据插入/更新到其中,该命令易于使用,但不幸的是增加了它正在替换的记录的'ID' 值。

所以我需要一种方法来完全重建ID feild 以便:

| ID  |  Name   |
|===============
| 21  |  deer   |
| 8   |  snow   |
| 3   |  tracks |
| 14  |  arrow  |

前往:

| ID |  Name   |
|===============
| 1  |  deer   |
| 2  |  snow   |
| 3  |  tracks |
| 4  |  arrow  |

我需要通过 php 来完成。

当前尝试:

<?php
$reset = "SET @num := 0;
UPDATE `users` SET `ID` = @num := (@num+1);
ALTER TABLE `users` AUTO_INCREMENT =1;";

$con = mysql_connect("mysql2.000webhost.com","db_user","password");  
if (!$con)
{
     die('Could not connect: ' . mysql_error());
}
mysql_select_db("db_name", $con);
if (!mysql_query($reset,$con)) 
  {
    die('<h1>Nope:</h1>' . mysql_error());
  }
mysql_close($con);
?>

并尝试:

$reset = "ALTER TABLE `users` DROP `ID`;
ALTER TABLE `users` AUTO_INCREMENT = 1;
ALTER TABLE `users` ADD `ID` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;`";

也没有结果。

这一切都很奇怪

我尝试的两个$reset 命令都在 MySQL 中完美执行,但由于某种原因,它们无法在 PHP 中正常运行。


回答

正如答案所指出的,每个连接都会保留@变量,因此运行多个查询是完全合理的:

///Trigger multiple queries
$nope = '<h1>Nope:</h1>  ';
$res1 = "SET @num := 0;";
$res2 = "UPDATE `users` SET `ID` = @num := (@num+1);";
$res3 = "ALTER TABLE `users` AUTO_INCREMENT =1;";
if (!mysql_query($res1,$con)) die($nope . mysql_error());
if (!mysql_query($res2,$con)) die($nope . mysql_error());
if (!mysql_query($res3,$con)) die($nope . mysql_error());
mysql_close($con);

【问题讨论】:

    标签: php mysql primary-key reset rebuild


    【解决方案1】:

    mysql_* 不支持运行多个查询。您必须单独运行它们

    【讨论】:

    • 啊,这很有道理。但是如何在运行多个查询的同时仍然保留它们之间的 @num 变量?
    • 变量是每个连接的保留者,所以应该没问题。
    • 好的,在我打勾之前让我试一试
    • @tetris 你使用相同的 mysql_connect() 一个一个地运行它们
    • 是的——有效。将答案更新到我的问题中。谢谢大家
    【解决方案2】:
    1. 如果您使用INSERT INTO ... ON DUPLICATE KEY UPDATE ...,您可以保留您的“ID”

    【讨论】:

    • 没错,但是如果我有很多字段,那么UPDATE .... 会很长并且涉及到对吧?
    • 我不喜欢使用$fields = array(); 填写更改然后执行:$query = "INSERT INTO table SET " . implode(', ', $fields) . " ON DUPLICATE KEY UPDATE " . implode(', ', $fields);
    【解决方案3】:
    function table2array ($table_name, $unique_col = 'id')
        {
    $tmp=mysql_query("SELECT * FROM $table_name"); $count = mysql_num_rows($tmp);
    while($rows[] = mysql_fetch_assoc($tmp));
    array_pop($rows);
    for ($c=0; $c < $count; $c++) 
    {
      $array[$rows[$c][$unique_col]] = $rows[$c];
    }
    return $array;
        }
    
    function reindexTable($table_name,$startFrom = 1) // simply call this function where you need a table to be reindexed!
        {
    $array = table2array($table_name);
    $id = 1; foreach ($array as $row) 
    {
    mysql_query("UPDATE `".$table_name."` SET `id` = '".$id."' WHERE `".$table_name."`.`id` = ".$row['id']);
    $id++;
    }
    mysql_query("ALTER TABLE  `".$table_name."` AUTO_INCREMENT = ".$id);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      相关资源
      最近更新 更多