Dlaczego instrukcja UPDATE SET REPLACE () ma pasować do wierszy, ale nie zmienia żadnego i nie wyświetla ostrzeżeń?

9

Szukam określonego ciągu w polu i chcę go zastąpić nowym ciągiem. W szczególności chcę, aby wszystkie odniesienia do jednego adresu URL zostały zmienione na inny adres URL. Stworzyłem tę instrukcję SQL i uruchamiam ją po wyświetleniu mysql>monitu w CentOS 5.5 za pomocą MySQL Community Server 5.1.54.

update [table] set [field] = REPLACE([field],'%domain.com%','%domain.org%');

Odpowiedź brzmi:

Query OK, 0 rows affected (0.02 sec)
Rows matched: 618  Changed: 0  Warnings: 0

Jak mogę sprawdzić, dlaczego nie wprowadzono żadnych zmian?

EDYCJA 1:

Dzięki Aaronowi Bertrandowi odkryłem, że REPLACE()nie potrafię obsłużyć symboli wieloznacznych i użyłem go całkowicie źle (pomyśl: brakująca WHEREklauzula). Oto moje zreformowane oświadczenie:

UPDATE [table]
SET [column] =
REPLACE (
    [column],
    'companydomain.com',
    'companydomain.org' )
WHERE
    [column]
LIKE
    '%companydomain.com%';

Do którego otrzymuję stary, znajomy:

Query OK, 0 rows affected (0.02 sec)
Rows matched: 167  Changed: 0  Warnings: 0

Co mogę zrobić źle?

EDYCJA 2:

Powiem ci, co robiłem źle !! Nie kwestionowałem założeń. Moje założenie było takie, że ciąg, który zastępowałem, był pisany małymi literami. Klauzula WHERE zwracała wszystkie rzeczy, które wyglądałyLIKE %companydomain.com%. Obejmuje to wszystkie permutacje wielkich liter, takie jak CompanyDomain.com, CoMpAnYdOmAiN.com itp.

Przekazał to, na REPLACE()co wtedy dokładnie szukał companydomain.com, a następnie zastąpił go companydomain.org.

REPLACE (
    [column],
    'companydomain.com',
    'companydomain.org' )

Oczywiście moje rekordy zostały zwrócone, ale nic nie zostało zastąpione. Po zmianie, REPLACE()aby uwzględnić wielkie litery, wszystkie rekordy zostały zaktualizowane i wydaje się, że wszystko jest w porządku. Prawidłowa REPLACE()składnia mojego scenariusza była więc następująca:

REPLACE (
    [column],
    'CompanyDomain.com',
    'companydomain.org' )
Wesley
źródło

Odpowiedzi:

12

REPLACEnie gra w ten sposób symbolami wieloznacznymi. Myślę, że miałeś na myśli:

UPDATE [table] 
  SET [column] = REPLACE([column],'TLD.com','TLD.org')
  WHERE [column] LIKE '%TLD.com%';

Nie masz WHEREklauzuli, więc próbował zaktualizować 618 wierszy, ale nie znalazł żadnych wystąpień %TLD.com%w tej kolumnie. Aby zobaczyć, które wiersze powinny zostać zmienione, uruchom SELECTzamiast tego:

SELECT [column], REPLACE([column], 'TLD.com', 'TLD.org') AS new_value
  FROM [table]
  WHERE [column] LIKE '%TLD.com%';
Aaron Bertrand
źródło
0

Najpierw musimy sprawdzić za pomocą selectzapytania:

SELECT * FROM colleges
WHERE course_name LIKE '%&amp%'

Następnie musimy zaktualizować:

UPDATE colleges
SET course_name = REPLACE(course_name, '&amp', '&')
WHERE id = 1

Wyniki: Cloud &amp Enterprise ComputingCloud & Enterprise Computing

Wreszcie, musimy ubiegać się o wszystkie:

UPDATE colleges
SET course_name = REPLACE(course_name, '&amp', '&')

Wyniki: Corporate &amp Insolvency LawCorporate & Insolvency Law

Salomon
źródło