#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();
}
}