Php 为条目添加前缀所需的mysql更新帮助

Php 为条目添加前缀所需的mysql更新帮助,php,mysql,Php,Mysql,很抱歉这个糟糕的标题,但我想不出另外一种方式来描述它。我需要做的是,为列中的某些条目添加前缀 例如,一列可能有数字条目,如:92209.192201、192202、1等。我需要只为没有前缀的数字添加前缀。92209.1变为TMP92201,1 我知道如何使用UPDATE函数,但不确定如何使用这种类型的查询。如果您能提供任何帮助,我将不胜感激。谢谢您应该使用以下语句: UPDATE TABLE_NAME SET FIELD_NAME = CONCAT('TMP', RIGHT(FIELD_NAME

很抱歉这个糟糕的标题,但我想不出另外一种方式来描述它。我需要做的是,为列中的某些条目添加前缀

例如,一列可能有数字条目,如:92209.192201、192202、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%'

本质上,它将从名为
table\u NAME
的表中更改名为
field\u NAME
的字段的值,以
'92209.1'
开头的每一行都有
field\u NAME
。要设置的值是通过连接
'TMP'
字段名的值来获得的,我们删除了前缀大小的左侧部分(7个字符)。

您应该使用以下语句:

UPDATE TABLE_NAME SET FIELD_NAME = CONCAT('TMP', RIGHT(FIELD_NAME, LENGTH(FIELD_NAME) - 7)) WHERE FIELD_NAME LIKE '92209.1%'
本质上,它将从名为
table\u NAME
的表中更改名为
field\u NAME
的字段的值,以
'92209.1'
开头的每一行都有
field\u NAME
。将要设置的值是通过连接
'TMP'
字段名称的值来获得的,我们将前缀大小的左侧部分(7个字符)删除到该字段中。

让我们假设下表

CREATE TEMPORARY TABLE soFoo (
    id int auto_increment,
    v varchar(32),
    primary key(id)
)
您可以选择所有具有
v
且不带前缀的行

SELECT
  *
FROM
  soFoo
WHERE
  v NOT LIKE 'TMP%'
并且,您可以将具有相同WHERE子句的update查询限制为仅影响具有
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();
    }
}
让我们假设这个表

CREATE TEMPORARY TABLE soFoo (
    id int auto_increment,
    v varchar(32),
    primary key(id)
)
您可以选择所有具有
v
且不带前缀的行

SELECT
  *
FROM
  soFoo
WHERE
  v NOT LIKE 'TMP%'
并且,您可以将具有相同WHERE子句的update查询限制为仅影响具有
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();
    }
}

请执行以下操作:编辑您的帖子,在那里添加一些换行符,使其可读;请举例说明您希望执行的操作。这是一次性修复,因此性能不成问题(即,无论是0.1秒、1秒还是10秒)@VolkerK 1次。所以时间不是问题。Thanks@Romain. 我在问题中举了一个例子。谢谢,请修复示例中的打字错误:“92209.1变为TMP02201,1”请执行以下操作:编辑您的帖子,在那里添加一些换行符,使其可读;请举例说明您希望执行的操作。这是一次性修复,因此性能不成问题(即,无论是0.1秒、1秒还是10秒)@VolkerK 1次。所以时间不是问题。Thanks@Romain. 我在问题中举了一个例子。谢谢,请修复示例中的打字错误:“92209.1变为TMP02201,1”Romain。请你解释一下这句话好吗。谢谢回答中的解释。不幸的是,并非所有条目都是7个字符。那么,这仅仅是一个先做7位数序列,然后再做6位数序列的例子。等等。谢谢您还可以使
7
部分的
右侧
动态(如果您在表/视图中的某个位置有前缀集(或者可以以表格形式提供),您可以使用
LENGTH(PREFIX)
)。请你解释一下这句话好吗。谢谢回答中的解释。不幸的是,并非所有条目都是7个字符。那么,这仅仅是一个先做7位数序列,然后再做6位数序列的例子。等等。谢谢您还可以将
7
部分设置为动态的
RIGHT
(您可以在那里使用
LENGTH(PREFIX)
),如果您在表/视图中的某个位置有前缀集(或者可以以表格形式提供)。