Originariamente inviato da Kaesar83
Ciao ragazzi,
avrei bisogno di una mano.
Sono alle prese con la creazione di una tabella molto grande (circa un milione di tuple).
Volevo sapere come fare per controllare che una tupla sia stata già inserita nel DB, in modo da non ripetere l'operazione inutilmente.
Mi spiego meglio:
ho una tabella formata da 5 campi

id1 | id2 | valore1 | valore2 | valore3

Una volta che è stata inserita la tupla avente id1= 100 e id2= 235 è inutile poi inserire la tupla che avrà id1=235 e id2=100 visto che i valori saranno gli stessi.
Come potete immaginare questo controllo mi serve per dimezzare di fatto la dimensione della tabella.
Idee?
Grazie in anticipo
Con altri database è possibile definire un indice utilizzando direttamente le funzioni greatest() e least() per impostare la reciprocità. Mysql invece non lo permette.

Potresti utilizzare due trigger, uno pre-inserimento e uno pre-aggiornamento:


codice:
create table if not exists prova_trigger (
id int not null auto_increment primary key,
id1 int,
id2 int,
valore1 int,
valore2 int,
valore3 int,
unique index unico (id1,id2)
) engine=myisam;

delimiter //
create trigger inserimento before insert on prova_trigger
 for each row 
 begin
 declare minimo integer;
 declare massimo integer; 
  set minimo = least(new.id1,new.id2);
  set massimo = greatest(new.id1,new.id2);
  set NEW.id1 = minimo;
  set NEW.id2 = massimo;
  end;
//
delimiter ; //

delimiter //
create trigger aggiornamento before update on prova_trigger
 for each row 
 begin
 declare minimo integer;
 declare massimo integer; 
  set minimo = least(new.id1,new.id2);
  set massimo = greatest(new.id1,new.id2);
  set NEW.id1 = minimo;
  set NEW.id2 = massimo;
  end;
//
delimiter ; //

insert into prova_trigger (id1,id2,valore1,valore2,valore3) values (1,2,3,4,5); /* a buon fine*/
insert into prova_trigger (id1,id2,valore1,valore2,valore3) values (2,3,4,5,6); /* a buon fine*/

insert into prova_trigger (id1,id2,valore1,valore2,valore3) values (2,1,4,5,6);
/*
Query : insert into prova_trigger (id1,id2,valore1,valore2,valore3) values (2,1,4,5,6);
Error Code : 1062
Duplicate entry '1-2' for key 'unico'
*/
update prova_trigger set id1 = 2, id2 = 1 where id = 2;
/*Query : update prova_trigger set id1 = 2, id2 = 1 where id = 2 
Error Code : 1062
Duplicate entry '1-2' for key 'unico'
*/