¿Por qué una actualización establecida reemplazar () coincidiría con las filas, pero no cambiaría ninguna y no dará advertencias?

dba.stackexchange https://dba.stackexchange.com/questions/12433

  •  16-10-2019
  •  | 
  •  

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' )
¿Fue útil?

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 '%&amp%'

A continuación, tenemos que actualizar:

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

Resultados: Cloud &amp Enterprise ComputingCloud & Enterprise Computing

Finalmente, tenemos que solicitar todos:

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

Resultados: Corporate &amp Insolvency LawCorporate & Insolvency Law

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top