のは、テーブル
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%'
今、あなたはあなたの静的な文字列リテラル
SET
v = CONCAT('TMP', v)
完全なクエリで始まる彼らの現在の値にそれらの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
これは1回限りの問題ですか?そのため、パフォーマンスに大きな問題はありません(つまり、0.1秒、1秒、10秒のどちらにしても問題ありません)。 – VolkerK
@VolkerK 1回。時間は問題ではありません。ありがとう – bollo