2011-11-08 36 views
1

对不起的标题,但我想不出用其他方式来描述它。我需要做的是,为列中的某些条目添加前缀。mysql更新帮助需要为条目添加前缀

例如,一列可能有数字条目,例如:92209.1,92201,1,92202,1等我需要添加一个前缀只有数字没有前缀。 92209.1变成TMP92201,1。

我知道如何使用UPDATE函数,但不知道如何使用这种类型的查询。我会感谢您提供的任何帮助。由于

+0

请做以下内容:编辑您的帖子以在其中添加一些换行以使其可读;提供一个你想要做什么的例子。 – Romain

+0

这是一次性修复,因此性能没有太大问题(即无论是否需要0.1,1或10秒)? – VolkerK

+0

@VolkerK 1次。所以时间不是问题。谢谢 – bollo

回答

4

您应该使用的线沿线的一个声明:

UPDATE TABLE_NAME SET FIELD_NAME = CONCAT('TMP', RIGHT(FIELD_NAME, LENGTH(FIELD_NAME) - 7)) WHERE FIELD_NAME LIKE '92209.1%' 

本质上,它会改变从表命名FIELD_NAME字段的值称为TABLE_NAME对于具有FIELD_NAME开始'92209.1'每一行。将设置的值通过连接'TMP'和我们移除前缀大小的左边部分(7个字符)的值FIELD_NAME获得。

+0

罗曼。你能解释一下这个声明吗?谢谢 – bollo

+0

在答案中添加了解释。 – Romain

+0

谢谢你的解释 – bollo

4

假设表

CREATE TEMPORARY TABLE soFoo (
    id int auto_increment, 
    v varchar(32), 
    primary key(id) 
) 

您可以通过

SELECT 
    * 
FROM 
    soFoo 
WHERE 
    v NOT LIKE 'TMP%' 

选择具有v没有前缀的所有行,你可以用相同的WHERE子句限制更新查询只影响行没有前缀的v

UPDATE 
    soFoo 
SET 
    ... 
WHERE 
    v NOT LIKE 'TMP%' 

现在要将这些v S设定与你的静态字符串字面量为前缀的当前值

SET 
    v = CONCAT('TMP', v) 

完整的查询:

UPDATE 
    soFoo 
SET 
    v = CONCAT('TMP', v) 
WHERE 
    v NOT LIKE 'TMP%' 

自足例如:

<?php 
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
setup($pdo); 

echo "before:\n"; 
foreach($pdo->query("SELECT * FROM soFoo", PDO::FETCH_ASSOC) as $row) { 
    echo join(' | ', $row), "\n"; 
} 

$query = " 
    UPDATE 
     soFoo 
    SET 
     v = CONCAT('TMP', v) 
    WHERE 
     v NOT LIKE 'TMP%' 
"; 
$pdo->exec($query); 

echo "\n\nafter:\n"; 
foreach($pdo->query("SELECT * FROM soFoo", PDO::FETCH_ASSOC) as $row) { 
    echo join(' | ', $row), "\n"; 
} 

function setup($pdo) { 
    $pdo->exec('CREATE TEMPORARY TABLE soFoo (
     id int auto_increment, 
     v varchar(32), 
     primary key(id) 
    )'); 

    $stmt = $pdo->prepare('INSERT INTO soFoo (v) VALUES (:v)'); 
    $stmt->bindParam(':v', $v); 
    // add some rows with and some without the prefix 
    for($i=0; $i<20; $i++) { 
     $v = rand(1000, 10000); 
     if (0==$v%2) { 
      $v = 'TMP'.$v; 
     } 
     $stmt->execute(); 
    } 
}