Marzo 14

2018

Porque controlar claves duplicadas con un Trigger

Hoy os traigo algo que, seguramente, a muchos no ha vuelto loco alguna vez. Supongamos que en una tabla tenemos mas de una columna con el atributo de UNICO, pero cuando vamos a insertar un registros no podemos "controlar" que es lo que se introduce. Por lo tanto, podriamos recibir el error desde MySql de "Error Code: 1062. Duplicate entry 'blablabla' for key 'bla_UNIQUE'" cosa no muy agradable.

Esto lo podemos controlar con un TRIGGER en la tabla con la propiedad de BEFORE INSERT para que compruebe ese campo ANTES de hacer la inserccion, y tomemos las medidas oportunas.

Todo depende de que es lo que quieres hacer

El ejemplo que te propongo es el siguiente.

Tenemos una tabla en la que hay un campo llamado link, el cual no queremos que se repita y por lo tanto tiene la propiedad UNIQUE activada. Aunque realmente no lo necesitaria con este script ya que siempre lo controlaria, pero aun asi no esta de mas "evitar" posibles errores de implementacion y siempre tener esa propiedad activada.

Sigamos con el ejemplo. Cuando agregamos un registro, el script captura el campo trading_name para con el generar el campo link. Si existe escribe el mismo nombre a generar con el numero de veces que se repite. Asi siempre es unico y podemos insertar el registro.

Pero si lo que quieres es hacer que si existe lo inserte en otra tabla, o borre el anterior, o actualice el registro existente, eso ya dependera de que quieres hacer.

Manos a la obra

El script lo he intentado simplificar al maximo, ya que realmente es algo mas complicado de lo que se muestra aqui. Pero como ejemplo espero que se entienda


create trigger ins_contact before insert on business_contacts       /* definimos el trigger */	
for each row /* le indicamos que lo realice para cada fila insertada */
set new.link = /* aqui es donde asignamos el valor utilizando la palabra reservada NEW */
if((select count(*) from business_contacts bc where bc.link like concat('%', lower(replace(trim(new.trading_name), ' ', '-')),'%') ) /* cuento */
>0, /* si hay mas de 0 registros entonces existe y hay que cambiar el valor*/
concat(lower(replace(trim(new.trading_name),' ', '-')) /* aqui es donde creo el valor, reemplazando los espacios por - en el nombre (igual que en la consulta de cuenta) */
,(select count(*) from business_contacts bc where bc.link like concat('%',lower(replace(trim(new.trading_name),' ', '-')),'%')))
,lower(replace(trim(new.trading_name),' ', '-')) /* si no hay nada sencillamnte asignar el nuevo valor */
);

Consideraciones

Como notaras se hace uso de la palabra reservada NEW que hace referencia a los datos que se estan introduciendo.

Este script esta probado en MySQL, pero deberia de funcionar bajo MariaDB, y seria facil implementarlo en Ms-SQL, solo cambiar las palabras reservadas a como es en cada base de datos.

Agradecer la publicacion de Jorge Martinez Foronda que, aunque esta hecho para MS-SQL, me dio la idea de como implementarlo en MySql. Como siempre en los links encontrareis toda la documentacion que me ha ha ayudado, no toda la encontrada, mucha no solucionaba este problema.


#SQL #MySql #trucos


0 Comentarios



Archivo