19604
<http://www.shinbo.org/archives/2836>

```

    UPDATE ITEMS SET MOVIE=REPLACE(MOVIE,”.flv”,”.mp4″);
    
```

こちらをもとにWordPressのカスタムフィールドの文字を全て一括置換すると、なぜかカスタムフィールドが全滅してしまいました。Select文で調べると、値と名前が同じになってしまっていました。

というのが先月にあり、バックアップも取っていなかったため全て手作業で治す羽目になって以来、トラウマであまりSQL文を使いたくないんですが今回また置換したいことがありまして、一度テスト仮実行したいのですがどうすればできますか？

今回実行したいのはWordpress wp_posts post_contentのリンクタグです。

```

    UPDATE wp_posts SET post_content= REPLACE(
        post_content,
        '<a href="http://',
        '<a href="https://"')
    WHERE post_content like '%<a href="https://"%';
    
```

・PHPMyAdminはセキュリティ上インストールしません。  
・バックアップは成功したときの削除方法や、失敗して復元した際、厳密に復元されるかどうかわからないので取りません。  
・他にも複雑な文字列を置換したいので成功した暁にまた実行したいです、なのでWordPressの置換プラグインは使いません。
CC BY-SA 3.0
2015-12-03T17:39:48.323
19603
2015-12-03T18:07:57.173
7973
question
mysql sql
MySQL一括置換
失敗したくなければBEGINを使ってトランザクションに含めればいいです。うまくUPDATEできていればCOMMIT,思った通りにならなければROLLBACKすれば元に戻ります。

**UPDATEをしくじったら元に戻す例**

```

    BEGIN;
        UPDATE ITEMS SET MOVIE=REPLACE(MOVIE,”.flv”,”.mp4″);
        SELECT * FROM ITEMS; -- 確認用
    ROLLBACK; -- 失敗していたら元に戻す
    
```

**UPDATEがうまく行ったら確定する例**

```

    BEGIN;
        UPDATE ITEMS SET MOVIE=REPLACE(MOVIE,”.flv”,”.mp4″);
        SELECT * FROM ITEMS; -- 確認用
    COMMIT; -- 確定操作
    
```

mysqlのコマンドラインツールはデフォルトではオートコミットになっています。つまりUPDATE文を実行したらいきなり確定になります。これを手動コミットにするには

```

    SET autocommit = 0;
    
```

とします。するとCOMMITかROLLBACKが常に必要になります。

バックアップは厳密に復元されるようにできています。テストDBを作って練習することをお勧めします。バックアップの無いデータは元から存在しないと思え、と私は習いました。
CC BY-SA 3.0
2015-12-03T18:06:11.910
19604
2015-12-03T18:07:57.173
2015-12-03T18:07:57.173
7837
7837
19603
answer