[Bulma] duda de SQL

Hugo Chinchilla hugo en bulma.net
Sab Mar 29 00:50:40 CET 2008


El 28/03/08, Joan Miquel Torres Rigo <joanmiquel en mallorcaweb.net> escribió:
> A Divendres 28 Març 2008 18:17, Hugo Chinchilla va escriure:
>
> > Hola de nuevo, tengo un problema con una sentencia SQL, estoy
>  > intentando cambiar en una tabla todo lo que tenga el valor 'post_tag'
>  > por 'category', cuando ejecuto la consulta " update wp_term_taxonomy
>  > set taxonomy='category' where taxonomy='post_tag'; " me da un error y
>  > se para.
>  > Lo que quiero es que ignore el error y continué con la ejecución,
>  > ¿existe algún parámetro para eso?
>
>
> Ninguna base de datos que pueda llamarse como tal te permitirá hacer eso.
>
>  Un update es una OPERACIÓN ATÓMICA. Por lo tanto, no puede hacerse "a medias".
>  O se completa o la BD vuelve al estado inicial.
>
>
>  Lo que sí puedes hacer es "modificar el comportamiento del update" mediante un
>  trigger sobre la tabla afectada (la última vez que usé mysql aún no habia
>  triggers, pero creo que ha llovido mucho desde entonces) para evitar que
>  llegue a producirse el error.
>
>  En postgres seria algo así:
>
>  -8<---------------------------
>
>  create or replace function JumpDuplicated()
>  Returns trigger
>  AS '
>  DECLARE
>
>  BEGIN
>
>         if (
>                 -- Valor duplicado
>                 (
>                         select count(*)
>                         from wp_term_taxonomy
>                         where taxonomy = NEW.taxonomy
>                 ) > 0
>         ) then
>                 -- Generamos un "notice"
>                 -- (Feedback, pero no warning ni error)
>                 -- (Opcional, pero de buen gusto)
>                 RAISE NOTICE ''Ignorando valor duplicado: %'', NEW.taxonomy;
>
>                 -- Hacemos que la fila se quede como estaba:
>                 RETURN OLD;
>         else
>                 -- Permitimos que se actualice la fila:
>                 RETURN NEW;
>         end if;
>
>  END;
>  ' LANGUAGE plpgsql;
>
>  create trigger UpdateJumpDuplicaded before UPDATE
>         on wp_term_taxonomy for each row
>         execute procedure JumpDuplicated();
>  -8<---------------------------
>
>
>  >
>  > El error que me da es este:
>  >
>  > ERROR 1062 (23000): Duplicate entry '6-category' for key 2
>
>
> De todos modos aquí hay algo que no cuadra...
>
>  La sentencia que has pasado (cito):
>
>
>  > update wp_term_taxonomy set taxonomy='category' where taxonomy='post_tag';
>
>
> Cambia el valor de la columna taxonomy por 'category' donde anteriormente
>  valga 'post_tag' y por el error que te da, se entiende que la columna
>  taxonomy és unique, por lo que sólo puede existir una fila en que que
>  taxonomy valga 'category' (o cualquier otro valor concreto).
>
>  Y por otro lado, si te está dando error por duplicidad de clave, significa que
>  ya existe OTRA fila en que taxonomy vale 'category'. Por lo tanto ésta fila
>  no puede actualizarse a ese valor (hasta aquí Ok)
>
>  Pero, POR LA MISMA RAZÓN, si en la fila que te ha fallado taxonomy
>  valia 'post_tag' (si no no hubiera intentado modificarla), NO PUEDE EXISTIR
>  NINGUNA OTRA FILA en que taxonomy tenga ese mismo valor.
>
>
>  En otras palabras: ¿Qué demonios quieres hacer? Porque en el ejemplo que has
>  puesto, aún cuando evitaras que se ejecutara el error, conseguirias que se
>  completara la ejecución del update, si. Pero la única diferencia seria que
>  perderias más tiempo en hacer nada. (y si lo que quieres es implementar una
>  espera hay mejores formas de hacerlo... :-P)
>
>
>
>  >
>  > Lo que quiero que haga con estas filas es que las deje tal cual, pero
>  > no se como saltármelas en la consulta.
>
>
> ???
>
>  A qué llamas "consulta"? La sentencia que has pasado es un update. No devuelve
>  nada y, como te he explicado más arriba, en éste caso NO HACE NADA.
>
>  ¿Para qué quieres que continue?
>
>  Saludos.
>
>  --
>  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 *
>  -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
>
> _______________________________________________
>  Bulmailing mailing list
>  Bulmailing en bulma.net
>  http://llistes.bulma.net/mailman/listinfo/bulmailing
>  Etiqueta: http://breu.bulma.net/?l676
>

Bueno, a ver por donde empiezo xD que hay mucho a lo que responder.

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.

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).

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

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

Good programmers often confuse halloween (31 OCT) with christmas (25 DEC)


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