2010-06-29 73 views
9

Tôi cần phải thay thế một số ký tự trong các cột của bảng bằng cách sử dụng lệnh REPLACE.
Tôi biết rằng lệnh REPLACE cần tên cột, sau đó văn bản cần thay đổi (trong ví dụ sau, 'a' char) và văn bản mới (trong trường hợp sau, 'e' char).Thay thế tất cả các trường trong MySQL

UPDATE my_table SET my_column = REPLACE (my_column,'a','e'); 

Vì vậy, đó thực hiện lệnh này sẽ thay đổi tất cả các 'một' xuất hiện trong my_column cột của bảng my_table với 'e' char.

Nhưng điều gì xảy ra nếu tôi cần thực thi lệnh REPLACE cho mỗi cột chứ không chỉ cho một cột? Điều này có thể không?

Cảm ơn

+0

dba.stackexchange.com/questions/21147/query-to-find-and-replace-text-in-all-tables-and-fields-of-a-mysql- db – Foreever

Trả lời

8

Sử dụng truy vấn SQL sau đây để tạo ra các truy vấn SQL mà bạn cần phải thay thế một giá trị trong tất cả các cột.

select concat(
     'UPDATE my_table SET ', 
     column_name, 
     ' = REPLACE(', column_name, ', ''a'', ''e'');') 
from information_schema.columns 
where table_name = 'my_table'; 

Sau khi thực hiện truy vấn SQL này chỉ cần chạy tất cả truy vấn để thay thế tất cả các giá trị.


chưa được kiểm tra sau khi một số googling

Tạo một thủ tục lưu trữ với một lõi như thế này. Nó có thể chấp nhận tên của bảng, giá trị cần tìm và giá trị cần thay thế.

Ý tưởng chính là sử dụng:

  1. chuẩn bị phát biểu để thực hiện SQL năng động;
  2. con trỏ để lặp qua tất cả các cột của bảng.

Xem mã một phần (chưa được kiểm tra) bên dưới.

DECLARE done INT DEFAULT 0; 
DECLARE cur1 CURSOR FOR 
    SELECT column_name FROM information_schema.columns 
    WHERE table_name = 'my_table'; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

OPEN cur1; 
REPEAT 
    SET s = concat(
     'UPDATE my_table SET ', 
     column_name, 
     ' = REPLACE(', column_name, ', ''a'', ''e'');'); 
    PREPARE stmt2 FROM s; 
    EXECUTE stmt2; 
    FETCH cur1 INTO a; 
UNTIL done END REPEAT; 
CLOSE cur1; 
+0

Bạn sẽ muốn kiểm tra trong WHERE để chắc chắn rằng bạn đang cố gắng chạy thay thế văn bản trên các cột chỉ sử dụng các kiểu dữ liệu dựa trên văn bản;). Và điều này có thể được thực hiện bằng cách sử dụng các câu lệnh chuẩn bị MySQL (SQL động) ... –

+0

Hãy tự do chỉnh sửa câu trả lời của tôi @OMG Ponies –

+0

Tôi nghĩ, nhưng có lẽ tôi sai, rằng truy vấn được đề xuất cần thêm một dấu phẩy ở vị trí (4, 36). Bây giờ nó tạo ra CẬP NHẬT my_table SET my_column = REPLACE (my_column'ù ',' ù '); thay vì CẬP NHẬT my_table SET my_column = REPLACE (my_column, 'ù', 'ù'); – Mark

0

Bạn không thể làm những gì mình muốn. Nếu đó là tôi, tôi sẽ lấy một danh sách các tên cột và trong trình soạn thảo của tôi thực hiện tìm kiếm regex nhanh chóng và thay thế.

Find: (.+)

Replace: UPDATE my_table SET \1 = REPLACE (\1,'a','e');

5

tôi đã thực hiện một thay đổi nhỏ:

select concat(
    'UPDATE ', table_name, ' SET ', 
    column_name, 
    ' = REPLACE(', column_name, ', ''OLDTEXT'', ''NEWTEXT'');') 
from information_schema.columns 
where table_name = 'TABLENAME'; 

Mà sẽ sử dụng biến cho TABLENAME (chỉ là một chút ít gõ) - vì vậy bạn chỉ cần thay thế các công cụ trong mũ.

Ngoài ra, tôi không hiểu lúc đầu, nhưng điều này sẽ chỉ đầu ra danh sách truy vấn SQL mà bạn sau đó phải thực thi để thực sự thay thế mã. Hy vọng điều này sẽ giúp ...

1

Điều này sẽ thực hiện thủ thuật với một số PHP vì công cụ MySQL thường bao gồm PHP. Tested và làm việc :)

<?php 

     $host = 'localhost'; 
     $user = 'root'; 
     $pass = 'yourpass'; 
     $db = 'your_database_name'; 

     $connection = mysql_connect($host, $user, $pass); 
     mysql_select_db($db); 

     $thisword = "this one should be"; 
     $shouldbe = "like this"; 
     $thistable = "your_table_name"; 

     MySQL_replace_all($thisword, $shouldbe, $thistable); 

     function MySQL_replace_all($thisword,$shouldbe,$thistable){ 
      $cnamnes = "SHOW columns FROM " . $thistable; 
      $result = mysql_query($cnamnes); 
      while($columnname = mysql_fetch_row($result)){ 
       $replace_SQL = "UPDATE $thistable SET ". $columnname[0] ." = REPLACE(". $columnname[0] .",'". $thisword ."', '". $shouldbe ."');"; 
       echo $replace_SQL . "<br>"; 
       mysql_query($replace_SQL); 
      } 
    } 

?> 
+0

Được thăng hạng vì một vài lý do. Đầu tiên trong khi có thể có một số cách thức phức tạp để làm điều này bạn vẫn quản lý để đăng một cái gì đó mà * SILL * làm việc. Thứ hai, bạn đã nỗ lực cung cấp một tệp PHP đầy đủ để thực hiện điều này, điều này rất hữu ích cho những người mới bắt đầu. – John

+0

Cảm ơn! Nhạc hay trên trang web của bạn :) Theo dõi 04 .. –

+0

@carl_lingberg Bạn được chào đón, danh sách phát 2.8? Nếu vậy tôi đã tạo ra bài hát đó. – John

Các vấn đề liên quan