2013-10-24 51 views
0

我试图为数据库中存在的每一行分配一个名为'uniqueid'的字段。大约有188,000行可用。使用唯一值更新MYSQL中的每一行

这里是我使用的代码:

$connection = mysql_connect("localhost","root","root"); 
mysql_select_db("comics",$connection) or die ("Database not found"); 

$query = mysql_query("select * from comic_issues"); 

if ($query){ 
    $rows = mysql_num_rows($query); 

    foreach($rows as $row){ 
    $str = strtolower($row['series'].$row['volume'].$row['issue']); 
    $str = preg_replace('/[^A-Za-z0-9]/', '', $str); 

    $update = "update comic_issues set uniqueid='" . $str . "' where id='" . $row['ID'] . "'"; 
    mysql_query($update); 

    exit(); 
    } 
} 

正在发生的事情是,每一行都获得具有相同UNIQUEID,这似乎是每一个我运行脚本时不同的值更新。

+2

为什么不把'AUTO_INCREMENT'属性应用到'uniqueid'(如果它是一个整型数据类型),并让MySQL为你完成剩下的工作? – eggyal

+0

@eggyal我正在使用此字段可以将上传的CSV文件与我的内部数据同步。他们的内容可能不匹配我的,因此独特的领域。 – TerryG

回答

1

而不是

foreach($rows as $row){ 

你需要做的

while ($row = mysql_fetch_row($query)) { 

在你的代码$rows是一个数字,而不是一个数组,因此你不能做一个foreach就可以了。

+0

或者,您也可以从3个值中生成一个散列,并将其用于您的唯一ID。例如。 '$ str = md5($ row ['series']。$ row ['volume']。$ row ['issue']);'然后你不需要**任何**特殊字符! – TheStoryCoder

+0

我试过这段代码(while),它仍然不起作用。嗯。 – TerryG

+0

您的代码中可能存在其他问题。需要一些关于这个问题的更多细节。你应该试着回显$ str和$ update到屏幕上,看看它们是否包含正确的字符串......并且,在更新第一行后,你也会停止脚本 - 因为你的退出() - 你不要那样。 – TheStoryCoder

1

只是让MySQL的做这一切为您:

UPDATE comic_issues SET uniqueid = LOWER(CONCAT(series,volume,issue)) 

如果你还必须去除所有非字母数字字符,你可以写一个存储功能,或者使用UDF。

+0

特殊字符怎么样?很多都有连字符或撇号。 – TerryG

+0

@TerryGodier:如果你只关心连字符和撇号,你可以应用REPLACE()两次。 – eggyal

+0

可能会有额外的特殊字符,包括空格,逗号,数据中的任何内容。 – TerryG

相关问题