2009-06-16 8 views

Odpowiedz

18

Możesz wyszukać REGEXP z MySQL, ale niestety nie można zwrócić dopasowanej części.

Jest możliwe, aby to zrobić z SQL następująco:

UPDATE mytable 
SET  email = REPLACE(email, '@domain.xx', '@domain.yy') 
WHERE email REGEXP '@domain.xx$' 

Można pominąć klauzulę WHERE, ale może prowadzić do nieoczekiwanych rezultatów (jak @example.xxx.com zostaną zastąpione @example.yyx.com), więc lepiej zostawić to.

0

nie sprawdzić go, ponieważ nie mają zainstalowany mysql, ale wydaje się to może Ci pomóc

update table_name 
set table_name.email = substr(table_name.email, 0, position("@" in table_name.email) + 1) 
         + "new_domain"; 

PS. Regexp nie pomoże ci w aktualizacji, ponieważ może tylko pomóc ci znaleźć konkretne wejście podłańcucha w łańcuchu sprawdzania, gdy ciąg jest zgodny z wzorcem. Here można znaleźć odniesienie do odpowiednich funkcji.

2

Wolałbym zrobić to z PHP, jeśli to możliwe. Mysql niestety nie pozwala na przechwytywanie pasujących części w wyrażeniach regularnych. Albo jeszcze lepiej: można połączyć dwa tak, na przykład:

$emails = fetchAllDistinctEmailsIntoAnArray(); 
# Make the array int-indexed: 
$emails = array_values($emails); 
# convert the mails 
$replacedEmails = preg_replace('/xx$/', 'yy', $emails); 
# create a new query 
$cases = array(); 
foreach ($emails as $key => $email) { 
    # Don't forget to use mysql_escape_string or similar! 
    $cases[] = "WHEN '" . escapeValue($email) . 
       "' THEN '" . escappeValue(replacedEmails[$key]) . "'"; 
} 
issueQuery(
    "UPDATE `YourTable` 
    SET `emailColumn` = 
     CASE `emailColumn`" . 
      implode(',', $cases) . 
     " END CASE"); 

Należy zauważyć, że rozwiązanie to zajmie trochę czasu i może zabraknąć pamięci lub uderzyć limity wykonanie jeśli masz wiele wpisów w bazie danych . Możesz zajrzeć do ignore_user_abort() i ini_set(), aby zmienić limit pamięci dla tego skryptu.

Nota prawna: Skrypt nie został przetestowany! Nie używaj bez zrozumienia/testowania kodu (może zepsuć bazę danych).

3
UPDATE tableName 
SET email = CONCAT(SUBSTRING(email, 1, locate('@',email)), 'domain.yy') 
WHERE email REGEXP '@domain.xx$';