[Bulma] duda de SQL

Joan Miquel Torres Rigo joanmiquel en mallorcaweb.net
Sab Mar 29 18:06:52 CET 2008


A Dissabte 29 Març 2008 00:50, Hugo Chinchilla va escriure:
> El 28/03/08, Joan Miquel Torres Rigo <joanmiquelamallorcaweb.net> escribió:

[...]

> >  La sentencia que has pasado (cito):
> >  > update wp_term_taxonomy set taxonomy='category' where
> >  > taxonomy='post_tag';

[...]

> Lo que pasa es que hace un tiempo en un cambio de version de wordpress
> algunas de mis categorías  fueron misteriosamente convertidas a tags,
> y yo quería devolverles su estado de categorías (cosa que he logrado
> al fin).
>
> Lo que hay en la tabla es más o menos esto:
>
> id 1 | id 2 |  taxonomy | otros ...
>
> El error salta por ejemplo si tengo una categoría con id 2=2 y a la
> vez un tag con id 2 = 2 al intentar convertirlo a categoría.

Bueno, eso ya aclara un poco las cosas...

Lo que pasa no es que taxonomy sea unique, sino que hay una cláusula unique de 
taxonomy con, por lo menos, id2.

En ese caso, para modificar esas filas, tendrás que asignarle otro id nuevo y 
cuidado que, aunque mysql ya tiene cierta integridad relacional, creo que aún 
permite usar las antiguas tablas MyISAM que no la tien. Con lo que si haces 
eso te hará un desastre.

Si hay integridad relacional puede que no te permita el cambio o puede que te 
lo haga en cascada (actualizando todas las claves externas afectadas) que 
seria lo deseable.

Ojo también con los autonuméricos si hay alguno porque si metes un nuevo id a 
pelo puede que el mecanismo que utilice la BD para generarlos no se actualice 
y te den errores los nuevos insert (típicamente hasta que la secuencia llegue 
de nuevo a un valor no usado). Pero bueno, eso no es grave porque si no te 
das prisa se soluciona solo :-D


Pero eso es para hacer lo que no pedias (pero que supongo que también te 
interesará): modificar las líneas que tengan conflicto.


Ignorar un error en una operación atómica, como te dije, es imposible (aparte 
de erróneo, mal hecho, una salvajada, etc... ;-)). Lo único que puedes hacer 
es:

a) Evitar que se produzca el error (mediante la implementación de un trigger 
adecuado similar al ejemplo que te pasé). Pero eso seria adecuado para algo 
que deba ser una operativa "normal" para el uso de la B.D.

b) Dividir la operación en várias operaciones más pequeñas de manera que 
cuando una de ellas falle sólo se vuelva a tras esa operación y el proceso 
continue con el resto (es lo más adecuado en tu caso).

Seria algo así como:

-8<-------------------------------------------------------
for i in $(
	mysql -u root worpress -BNe "
		select 'id1 = ' || id1 || ' and id2 = ' || id2
		from wp_term_taxonomy
		where taxonomy = 'post_tag';
	" | xargs
); do
	mysql -u root wordpress -BNe "
		update wp_term_taxonomy
		set taxonomy = 'category'
		where ${i};
	";
done;
-8<-------------------------------------------------------

...pero cambiando 'root' por el nombre de usuario adecuado para acceder a la 
BD, 'wordpress' por el nombre que tenga la BD y añadiendo el parámetro con el 
password si procede.


>
> Esto es porque he vuelto a crear algunas de las categorías para
> algunos posts y el parámetro id2 las relaciona en otra tabla con su
> nombre de categoría o tag.
>
>
> Al final he ido ejecutando la orden y añadiendo "and not id='x'" donde
> x era el ultimo error que me hubiera dado, al final despues de 5 o 6
> intentos lo he conseguido (viva las chapuzas).

Es otra forma...

<para mi>
for (
	i = 0;
	i < 100000;
	i++
) {
	printf ('%s\n', 'Leeré los emails completos antes de empezar a responder.');
};
</para mi>

>
> Lo de consulta es un error de vocabulario mío, quería decir sentencias
> pero me ha salido así.

Ya me habia dado cuenta... No tiene importancia ;-)

Rezas 3 veces la GPL y tendrás la absolución :-P


> Soy muy muy nooooob en cuanto a bases de datos se refiere pero he
> conseguido devolverle a mi blog sus antiguas categorías :-D.

;-)


La próxima vez mejor pasa la estructura de la tabla ('describe <nombre_tabla>' 
en mysql) y así acabamos antes... Yo tampoco caí en que taxonomy podia ser 
parte de una clave única y no la clave en si misma.


Un saludo.

-- 
Joan Miquel Torres__________________________________
Linux Registered User #164872
http://www.mallorcaweb.net/joanmiquel
BULMA: http://bulma.net http://breu.bulma.net/?l2301

Demana sempre factura amb el cànon detallat quan compris CDs i
guarda-la: Si existeix la justícia algun dia els mafiosos ens
hauran de tornar el que ens han robat.
http://www.todoscontraelcanon.es

_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
AVÍS: NO accept i NO obro ARXIUS ADJUNTS EN FORMATS PROPIETARIS:
 *  http://www.gnu.org/philosophy/no-word-attachments.es.html *
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-


Más información sobre la lista de distribución Bulmailing