[Bulma] duda de SQL

Joan Miquel Torres Rigo joanmiquel en mallorcaweb.net
Vie Mar 28 23:14:03 CET 2008


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 *
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-


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