迭代MYSQL数据库并替换一列中每条记录中的数据

时间:2012-12-04 00:38:14

标签: mysql loops

在清除所有非数字后,我有这种非常低效的方式更新数据库中的电话号码。

$san_phone = mysql_query('SELECT * FROM table');

while ($row = mysql_fetch_array($san_phone)) {
    $row['phone_clean'] = preg_replace('#[^\d]#', '', $row['phone']);
    echo $row['id'] . ' - ' . $row['phone_clean'] . '<br>';

    mysql_query("UPDATE table SET phone = " . $row['phone_clean']  . " WHERE id = " . $row['id']);
}

循环的更新部分导致我在2,400条记录中只有大约400条后超时。很明显我做错了所以在上学的时候要温柔。 ;)

3 个答案:

答案 0 :(得分:1)

你可以使用类似这个用户定义的函数:

http://www.mysqludf.org/lib_mysqludf_preg/index.php#PREG_REPLACE_SECTION

https://launchpad.net/mysql-udf-regexp

并将您的查询重写为:

UPDATE table
SET phone = PREG_REPLACE('#[^\d]#', '', phone);

答案 1 :(得分:1)

首先,停止使用mysql_功能being deprecated。请改用mysqli_PDO函数。

您用于UPDATE记录的方法效率低下。您应该在单个查询中创建一个临时表INSERT新记录,最后运行UPDATE查询来替换数据。

你可以从这开始:

$san_phone = mysql_query('SELECT id, phone FROM table');
$insertArray = array();

while ($row = mysql_fetch_array($san_phone)) {
    $phone_clean = preg_replace('#[^\d]#', '', $row['phone']);
    echo $row['id'] . ' - ' . $row['phone_clean'] . '<br>';

    $insertArray[] = "(" . $row[id] . ", '" . $phone_clean . "')";
}

$insertQuery = "INSERT INTO tempTable (id, phone) VALUES ";
$insertQuery = implode(", ", $insertArray);
mysql_query($insertQuery);

我做了一个快速演示来说明这个过程。 t1是您的原始表,t2是包含要替换的数据的临时表。

See it in action

答案 2 :(得分:0)

好吧,对您的数据库的多次调用会导致速度受到影响,并且(根据我的经验),这是一个痛苦的。即使两次访问数据库也会导致一个明显的延迟。

要解决此问题,您希望最小化对数据库的调用,这意味着尽可能多地在一次调用中执行。为此,尝试将其重写为单个SQL更新,其中替换逻辑在SQL本身中。这意味着只需要一次数据库访问和大幅提升速度。

说起来容易做起来难,自从上次检查以来,MySQL没有正则表达式字符串替换功能。您可以尝试解决方法,或者查看一些UDF。另一个答案提供了一个链接。我建议调查一下。