справка по обновлению mysql, необходимая для добавления префикса к записям

#php #mysql

#php #mysql

Вопрос:

Извините за плохое название, но я не мог придумать другого способа описать это. Что мне нужно сделать, так это добавить префикс к определенным записям в столбце.

Например, столбец может содержать записи с номерами, такие как: 92209.1,92201,1,92202,1 и т.д. Мне нужно добавить префикс только к номерам без префикса. 92209.1 становится TMP92201,1.

Я знаю, как использовать функцию ОБНОВЛЕНИЯ, но не уверен, как использовать с этим типом запроса. Я был бы благодарен за любую помощь, которую вы можете предложить. Спасибо

Комментарии:

1. Пожалуйста, сделайте следующее: отредактируйте свой пост, добавив туда несколько переводов строк, чтобы сделать его читабельным; приведите пример того, что вы хотели бы сделать.

2. Это одноразовое исправление, и поэтому производительность не является большой проблемой (т. Е. Не имеет значения, займет ли это 0,1, 1 или 10 секунд)?

3. @VolkerK 1 раз. Таким образом, время не является проблемой. Спасибо

4. @Romain. Я привел пример в своем вопросе. Спасибо

5. Затем, пожалуйста, исправьте опечатку (ы) в примере: «92209.1 становится TMP02201,1»

Ответ №1:

Вы должны использовать инструкцию в соответствии с:

 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' и значения FIELD_NAME , до которого мы удалили левую часть размера префикса (7 символов).

Комментарии:

1. Роман. Не могли бы вы объяснить это утверждение, пожалуйста. Спасибо

2. Добавлено объяснение в ответе.

3. К сожалению, не все записи состоят из 7 символов. Итак, было бы просто сначала выполнить 7-значную серию, затем 6-значную серию. и т.д. спасибо

4. Вы также могли бы сделать 7 часть RIGHT динамической (вы могли бы использовать LENGTH(PREFIX) там), если у вас есть набор префиксов где-нибудь в таблице / представлении (или вы можете иным образом сделать его доступным в табличной форме).

Ответ №2:

Давайте предположим, что таблица

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

Вы можете выбрать все строки, имеющие v без префикса, через

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

и вы можете ограничить запрос на обновление тем же предложением 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 "nnafter: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();
    }
}