Newsgroup: it.comp.software.database
Titolo: [SQL Server] Relazioni e Chiavi

Ho un DB con due tabelle:
* Tab-A
   * Campo_1 - Caratteristica1
   * Campo_2 - Caratteristica2
   * Campo_3 - Nome Parametro
Chiave primaria definita sull'unione dei tre campi, ddal momanto che il Nome
Parametro (Campo_3) può ripetersi, ma solo se risultano differenti i valori
di Caratteristica1 e Caratteristica2.
* Tab-B
   * Campo_1 - Nome Parametro
   * Campo_2 - xxx
   * ....
   * Campo_n - xxx
qui la chiave è impostata su un campo ID con autoindremento.
Vorrei che in Tab-B / Nome Parametro potessero essere inseriti SOLO valori
presenti nell'equivalente campo di Tab-A / Nome Parametro. Volevo dunque
definire una relazione tra le due tabelle, ma il sistema me lo impedisce,
dal momento che Nome Parametro non è chiave primaria o non ha in indice
univoco sulla Tab-A.
Come posso fare?
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Come posso fare?
Oltre che a una PK, la FK può far riferimento ad una colonna (o un insieme 
di colonne) su cui è definito un vincolo di unicità (UNIQUE CONSTRAINT). 
In ogni caso occorre che il tipo di dato delle colonne in relazione sia identico.
Ciao!
--
[Francesco Quaratino]
"Enjoy Your SeQueL"
http://community.ugiss.org/blogs/sgainz


Come faccio allora (ammesso che sia possibile) a far sì che in Tab-B la
colonna NomeParametro contenga solo valori presenti nella omonima colonna in
Tab-A (dove NomeParametro di per sè NON può essere univoco)?


 univoco)?
..abbi fede :)
use tempdb
go
create table TabA (
	Caratteristica1 varchar(10) not null, 
	Caratteristica2 varchar(10) not null,
	NomeParametro varchar(10) not null constraint UX_NomeParametro unique,
	constraint PK_TabA primary key (Caratteristica1, Caratteristica2, NomeParametro), 
)
go
create table TabB (
	id int primary key not null,
  NomeParametro varchar(10) not null 
)
go
alter table TabB
ADD CONSTRAINT FK_TabB_TabA FOREIGN KEY(NomeParametro) 
REFERENCES TabA (NomeParametro) 
GO 
insert TabA values ('gigio', 'remigio', 'calcio')
insert TabA values ('pinco', 'pallino', 'tennis')
insert TabB values (1, 'calcio')
insert TabB values (2, 'basket')
--quest'ultimo va in errore


 > colonna in Tab-A (dove NomeParametro di per sè NON può essere

Il tuo esempio funziona (ovviamente!) benissimo, ma io avrei bisogno di una
condizione in cui poter inserire in Tab-A , per esempio ('gigio', 'remigio',
tennis'): questo perchè l'unicità è definita dalla tripletta, non solo da
NomeParametro! Nel tuo esempio, avendo indicato NomeParametro come UNIQUE
non ci riuscirei!
Temo di voler fare l'impossibile. Sto cercando di aggirare il problema.
Grazie davvero comunque!


 Inviato via 
http://arianna.libero.it/usenet/


 passare ai Booksonline di SQLServer
Come supponevo... OK, ci do un'occhiata appena ho un secondo, poi valuto se
mi costa meno studiare tutto o creare una soluzione alternativa!
Grazie comunque!


 complesse
In effetti e' curioso notare come nei dbms manchi il constraint
di inclusion dependency (di cui la pk/fk e' solo una delle
applicazioni).
Date dice che tale vincolo e' cosi' potente da poter derivare
tutti gli altri. Si potrebbe ad esempio implementare direttamente
una referenza molti a molti, senza dover ricorrere ad una
artificiosa tabella intermedia.
bye