Warum sollte ein Update -Set ersetzt () Anweisungszeilen übereinstimmen, aber keine ändern und keine Warnungen geben?
Frage
Ich suche eine bestimmte Zeichenfolge in einem Feld und möchte sie durch eine neue Zeichenfolge ersetzen. Insbesondere möchte ich, dass alle Verweise auf eine URL in eine andere URL geändert werden. Ich habe diese SQL -Anweisung erstellt und leite sie bei a mysql>
Eingabeaufforderung auf CentOS 5.5 mit MySQL Community Server 5.1.54.
update [table] set [field] = REPLACE([field],'%domain.com%','%domain.org%');
Die Antwort lautet:
Query OK, 0 rows affected (0.02 sec)
Rows matched: 618 Changed: 0 Warnings: 0
Wie kann ich aufspüren, warum keine Änderungen vorgenommen werden?
Bearbeiten 1:
Dank Aaron Bertrand habe ich das entdeckt REPLACE()
Ich kann mit Wildcards nicht umgehen und ich habe es völlig falsch verwendet (denken Sie: Fehlen WHERE
Klausel). Hier ist meine reformierte Erklärung:
UPDATE [table]
SET [column] =
REPLACE (
[column],
'companydomain.com',
'companydomain.org' )
WHERE
[column]
LIKE
'%companydomain.com%';
Worauf ich den alten, Vertrauten erhalte:
Query OK, 0 rows affected (0.02 sec)
Rows matched: 167 Changed: 0 Warnings: 0
Was könnte ich falsch machen?
Bearbeiten 2:
Ich werde dir sagen, was ich falsch gemacht habe !! Ich habe keine Annahmen in Frage gestellt. Mein Annahme war, dass die Schnur, die ich ersetzte, in allen niedrigeren Falls. Die wo Klausel erwiderte alle Dinge, die aussahen LIKE %companydomain.com%
. Dies beinhaltet alle Kapitalisierungspermutationen wie CompanyDomain.com, CompanyDomain.com usw. etc.
Es ging an das weiter REPLACE()
Dies war dann ausschließlich für CompanyDomain.com, um es dann durch CompanyDomain.org zu ersetzen.
REPLACE (
[column],
'companydomain.com',
'companydomain.org' )
Natürlich wurden meine Unterlagen zurückgegeben, aber nichts wurde ersetzt. Sobald ich mich verändert habe REPLACE()
Um die Kapitalisierung zu berücksichtigen, wurden alle Aufzeichnungen aktualisiert und es scheint, dass alles in Ordnung ist. Das richtige REPLACE()
Syntax für mein Szenario war also:
REPLACE (
[column],
'CompanyDomain.com',
'companydomain.org' )
Lösung
REPLACE
spielt nicht so mit Wildcards. Ich denke du meinst:
UPDATE [table]
SET [column] = REPLACE([column],'TLD.com','TLD.org')
WHERE [column] LIKE '%TLD.com%';
Du hast kein WHERE
Klausel, so es versucht um 618 Zeilen zu aktualisieren, aber es fand keine Fälle von %TLD.com%
in dieser Spalte. Um zu sehen, welche Zeilen betroffen sein sollten, laufen Sie a SELECT
stattdessen:
SELECT [column], REPLACE([column], 'TLD.com', 'TLD.org') AS new_value
FROM [table]
WHERE [column] LIKE '%TLD.com%';
Andere Tipps
Zuerst müssen wir mit einem überprüfen select
Anfrage:
SELECT * FROM colleges
WHERE course_name LIKE '%&%'
Als nächstes müssen wir aktualisieren:
UPDATE colleges
SET course_name = REPLACE(course_name, '&', '&')
WHERE id = 1
Ergebnisse: Cloud & Enterprise Computing
⇒ Cloud & Enterprise Computing
Schließlich müssen wir uns für alle bewerben:
UPDATE colleges
SET course_name = REPLACE(course_name, '&', '&')
Ergebnisse: Corporate & Insolvency Law
⇒ Corporate & Insolvency Law