¿Por qué una actualización establecida reemplazar () coincidiría con las filas, pero no cambiaría ninguna y no dará advertencias?
Pregunta
Estoy buscando una determinada cadena en un campo y quiero reemplazarla con una nueva cadena. Específicamente, quiero que todas las referencias a una URL se cambien a otra URL. He elaborado esta declaración SQL y la estoy ejecutando en un mysql>
Solicitud en CentOS 5.5 utilizando MySQL Community Server 5.1.54.
update [table] set [field] = REPLACE([field],'%domain.com%','%domain.org%');
La respuesta es:
Query OK, 0 rows affected (0.02 sec)
Rows matched: 618 Changed: 0 Warnings: 0
¿Cómo puedo rastrear por qué no se realizan cambios?
Editar 1:
Gracias a Aaron Bertrand, descubrí que REPLACE()
No puedo manejar los comodines y lo estaba usando completamente mal (piense: faltar WHERE
cláusula). Aquí está mi declaración reformada:
UPDATE [table]
SET [column] =
REPLACE (
[column],
'companydomain.com',
'companydomain.org' )
WHERE
[column]
LIKE
'%companydomain.com%';
A lo que recibo el viejo y familiar:
Query OK, 0 rows affected (0.02 sec)
Rows matched: 167 Changed: 0 Warnings: 0
¿Qué podría estar haciendo mal?
Editar 2:
¡Te diré lo que estaba haciendo mal! No estaba cuestionando suposiciones. Mi suposición era que la cadena que estaba reemplazando era en minúsculas. La cláusula Where estaba devolviendo todas las cosas que parecían LIKE %companydomain.com%
. Eso incluye todas las permutaciones de capitalización como CompanyDomain.com, CompanyDomain.com y etc.
Pasó eso a REPLACE()
Lo que luego se veía estrictamente para que CompanyDomain.com lo reemplace con CompanyDomain.org.
REPLACE (
[column],
'companydomain.com',
'companydomain.org' )
Entonces, por supuesto, mis registros estaban siendo devueltos, pero no se reemplazaba nada. Una vez que cambié REPLACE()
Para tener en cuenta la capitalización, todos los registros se actualizaron y parece que todo está bien. Lo correcto REPLACE()
La sintaxis para mi escenario fue así:
REPLACE (
[column],
'CompanyDomain.com',
'companydomain.org' )
Solución
REPLACE
No juega con comodines de esa manera. Creo que te refieres:
UPDATE [table]
SET [column] = REPLACE([column],'TLD.com','TLD.org')
WHERE [column] LIKE '%TLD.com%';
No tienes WHERE
cláusula, así que intentó para actualizar 618 filas, pero no encontró ninguna instancia de %TLD.com%
en esa columna. Para ver qué filas deben estar afectadas, ejecute un SELECT
en cambio:
SELECT [column], REPLACE([column], 'TLD.com', 'TLD.org') AS new_value
FROM [table]
WHERE [column] LIKE '%TLD.com%';
Otros consejos
Primero, tenemos que verificar usando un select
consulta:
SELECT * FROM colleges
WHERE course_name LIKE '%&%'
A continuación, tenemos que actualizar:
UPDATE colleges
SET course_name = REPLACE(course_name, '&', '&')
WHERE id = 1
Resultados: Cloud & Enterprise Computing
⇒ Cloud & Enterprise Computing
Finalmente, tenemos que solicitar todos:
UPDATE colleges
SET course_name = REPLACE(course_name, '&', '&')
Resultados: Corporate & Insolvency Law
⇒ Corporate & Insolvency Law