对不起的标题,但我想不出用其他方式来描述它。我需要做的是,为列中的某些条目添加前缀。mysql更新帮助需要为条目添加前缀
例如,一列可能有数字条目,例如:92209.1,92201,1,92202,1等我需要添加一个前缀只有数字没有前缀。 92209.1变成TMP92201,1。
我知道如何使用UPDATE函数,但不知道如何使用这种类型的查询。我会感谢您提供的任何帮助。由于
对不起的标题,但我想不出用其他方式来描述它。我需要做的是,为列中的某些条目添加前缀。mysql更新帮助需要为条目添加前缀
例如,一列可能有数字条目,例如:92209.1,92201,1,92202,1等我需要添加一个前缀只有数字没有前缀。 92209.1变成TMP92201,1。
我知道如何使用UPDATE函数,但不知道如何使用这种类型的查询。我会感谢您提供的任何帮助。由于
您应该使用的线沿线的一个声明:
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
获得。
假设表
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();
}
}
请做以下内容:编辑您的帖子以在其中添加一些换行以使其可读;提供一个你想要做什么的例子。 – Romain
这是一次性修复,因此性能没有太大问题(即无论是否需要0.1,1或10秒)? – VolkerK
@VolkerK 1次。所以时间不是问题。谢谢 – bollo