Univocità Attributo | Tips & Tricks

Topic: Pubblico - Composto da 3 Posts di 2 Utenti.

13 Aprile, 2011 16:26 #1
RoyBatty
Utente

RoyBatty
Registrato: Apr, 2011
Posts: 2
Offline

Ciao,

premetto che in una tabella rendere unico un attributo di tipo boolean non ha senso.
Es:

CREATE TABLE `myTable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`avaiable` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
CONSTRAINT unique_senseless UNIQUE(avaiable)
)

in quanto, quando la tabella conterrà un numero di tuple maggiore di 2, ci saranno almeno due valori uguali per l'attributo 'avaiable'.

La mia richiesta è questa: come faccio a rendere unico il VALORE di un attributo.
Es. voglia che nella mia tabella ci sia al massimo una tupla con attributo avaiable=true

SI
-----------------
| id | avaiable |
-----------------
| 1 | false |
| 2 | true |
-----------------

SI
-----------------
| id | avaiable |
-----------------
| 1 | false |
| 2 | false |
-----------------

NO!!
-----------------
| id | avaiable |
-----------------
| 1 | true |
| 2 | true |
-----------------

13 Aprile, 2011 17:08 #2
john_revelator
Moderatore

john_revelator
Registrato: Jun, 2009
Posts: 270
Offline

Ciao. Prova a dare uno sguardo a questo codice di esempio che ti ho scritto.

 1drop table if exists mytable;
 2create table mytable (
 3id int(11) not null auto_increment primary key,
 4available tinyint(1) not null
 5);
 6
 7drop table if exists errori;
 8create table errori (                                                                                                         
 9id int not null auto_increment primary key,                                                                         
10messaggio varchar(128) default null,                                                                                    
11unique key imess (messaggio)
12) engine=myisam;
13
14
15delimiter //
16drop trigger if exists verifica//
17create trigger verifica before insert on mytable
18for each row
19begin
20   if(select count(*) from mytable where available = 1 > 0 and new.available = 1) then
21        call fallito("esiste gia' un record con valore pari a 1");
22   end if;
23end//
24delimiter ;
25
26
27delimiter //
28drop procedure if exists fallito //
29create procedure fallito(mess varchar(200))
30begin
31  insert into errori (messaggio) values (mess);
32  insert into errori (messaggio) values (mess);
33end//
34delimiter ;
35
36
37insert into mytable (available) values (0);
38insert into mytable (available) values (1);
39insert into mytable (available) values (0);
40insert into mytable (available) values (0);
41insert into mytable (available) values (1);


No PVT tecnici. Non rispondo nemmeno. Usate il forum.
My SO profile

14 Aprile, 2011 11:43 #3
RoyBatty
Utente

RoyBatty
Registrato: Apr, 2011
Posts: 2
Offline


ad una prima occhiata non dovrebbe essere complicato aggiungere delle eccezioni (al posto della tabella verifica)... di sicuro merita un'analisi più dettagliata.

ti ringrazio.

Saluti Roy Batty

Condividi su:

Loggati o Registrati per replicare