Impostazione Chiave esterna

mercoledì 12 novembre 2008 - 13.09

luxsor Profilo | Guru

Ho il seguente problema:

ho due tabelle:
- CLIENTI
campo ID come chiave primaria
campo CodiceOrdine com chiave esterna

- ORDINI
campo IDOrdine chiave primaria

Voglio mettere in relazione la tabella CLIENTI con la tabella ORDINI e per farlo devo creare un chiave esterna per il campo CODICEORDINE che mi metta in relazione con la chiave primaria della tabella ORDINI con il campo IDORDINE.

Da SQL Server Managemant System Express, come posso creare una chiave esterna?
In una tabella mi fa inserire solo una e una sola chive primaria.



lbenaglia Profilo | Guru

>Ho il seguente problema:
>
>ho due tabelle:
>- CLIENTI
>campo ID come chiave primaria
>campo CodiceOrdine com chiave esterna
>
>- ORDINI
>campo IDOrdine chiave primaria

Fammi capire, ad 1 ordine corrispondono più clienti?!
Non dovrebbe essere il contrario?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

luxsor Profilo | Guru

>Fammi capire, ad 1 ordine corrispondono più clienti?!
>Non dovrebbe essere il contrario?

Hai perfettamente ragione tu, ma io voglio che ad un ordine corrisponde un Cliente, ma lo stesso cliente può fare più ordini.

lbenaglia Profilo | Guru

>>Fammi capire, ad 1 ordine corrispondono più clienti?!
>>Non dovrebbe essere il contrario?
>
>Hai perfettamente ragione tu, ma io voglio che ad un ordine corrisponde
>un Cliente, ma lo stesso cliente può fare più ordini.
Appunto, non è quello che ho scritto io?
Dalla tabella clienti devi togliere la colonna CodiceOrdine, aggiungendo la colonna ClienteID alla tabella Ordini e definendo su quest'ultima un constraint di FOREIGN KEY:

USE tempdb; CREATE TABLE dbo.Clienti( ClienteID int NOT NULL PRIMARY KEY, Nome varchar(10) NOT NULL ); CREATE TABLE dbo.Ordini( OrdineID int NOT NULL PRIMARY KEY, ClienteID int NOT NULL, Data datetime NOT NULL, CONSTRAINT FK_Ordini_Clienti FOREIGN KEY(ClienteID) REFERENCES dbo.Clienti(ClienteID) ); INSERT dbo.Clienti VALUES(1, 'Lorenzo'); INSERT dbo.Clienti VALUES(2, 'Carmelo'); INSERT dbo.Ordini VALUES(10, 1, '20080101'); INSERT dbo.Ordini VALUES(20, 1, '20080102'); INSERT dbo.Ordini VALUES(30, 1, '20080103'); INSERT dbo.Ordini VALUES(40, 2, '20080201'); INSERT dbo.Ordini VALUES(50, 2, '20080202'); SELECT C.Nome, O.Data FROM dbo.Clienti AS C JOIN dbo.Ordini AS O ON C.ClienteID = O.ClienteID; /* Output: Nome Data ---------- ----------------------- Lorenzo 2008-01-01 00:00:00.000 Lorenzo 2008-01-02 00:00:00.000 Lorenzo 2008-01-03 00:00:00.000 Carmelo 2008-02-01 00:00:00.000 Carmelo 2008-02-02 00:00:00.000 (5 row(s) affected) */ DROP TABLE dbo.Ordini, dbo.Clienti;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

luxsor Profilo | Guru

Perfetto, con questa query hai messo in relazione tramite un foreign key idclinte con idordine. Giusto?
Senza la foreign key non sarebbe stato possibile effettuare la JOIN. Vero?

Adesso per creare un foreign key, no tramite una query, ma da sql managemant Studio Express come posso fare?

lbenaglia Profilo | Guru

>Perfetto, con questa query hai messo in relazione tramite un
>foreign key idclinte con idordine. Giusto?
No, ho definito un constraint FOREIGN KEY sulla colonna ClienteID della tabella Ordini che referenzia la colonna ClienteID della tabella Clienti.

>Senza la foreign key non sarebbe stato possibile effettuare la
>JOIN. Vero?
No, i constraint sono vincoli sui dati e non hanno niente a che vedere con l'operatore JOIN.

>Adesso per creare un foreign key, no tramite una query, ma da
>sql managemant Studio Express come posso fare?
Se SSMSE permette la definizione dei diagrammi (non ne sono certo) lo puoi fare da lì.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

luxsor Profilo | Guru

Scusami Lorenzo se ti sto dando fastidio, ma siccome non ho una grande esperiente su SQL, sto cercando di capire.

Tu hai detto
> ho definito un constraint FOREIGN KEY sulla colonna ClienteID della tabella Ordini che referenzia la colonna ClienteID della tabella Clienti.

>Senza la foreign key non sarebbe stato possibile effettuare la
>JOIN. Vero?
>> No, i constraint sono vincoli sui dati e non hanno niente a che vedere con l'operatore JOIN.

Io mi domando, a che cosa è servito creare la foreign key se l'operazione join si sarebbe potuta fare lo stesso?
A che serve creare un vincolo sui dati tramite il CONSTRAINT?

SCUSA ANCORA

lbenaglia Profilo | Guru

>Scusami Lorenzo se ti sto dando fastidio, ma siccome non ho una
>grande esperiente su SQL, sto cercando di capire.
Dove ho sctitto che mi stai dando fastidio?

>Io mi domando, a che cosa è servito creare la foreign key se
>l'operazione join si sarebbe potuta fare lo stesso?
>A che serve creare un vincolo sui dati tramite il CONSTRAINT?

Un constraint è un vincolo, ovvero una regola che non può essere violata.
Ne esistono di diverti tipi, ma concentriamoci sui constraint FOREIGN KEY.
Nell'esempio che stiamo vedendo, il constraint FK_Ordini_Clienti fa in modo che un ordine possa essere eseguito solo da un cliente censito nella tabella Clienti. Inoltre fa in modo che non sia possibile eliminare un cliente dalla tabella se quest'ultimo ha effettuato degli ordini (quindi evita che si possavo avere ordini "orfani").
A partire da SQL Server 2000 è possibile abilitare le operazioni "a cascata", ovvero poter eseguire la cancellazione automatica di tutti gli ordini di un dato cliente quando viene eliminato dalla tabella Clienti, oppure l'aggiornamento della colonna ClienteID nella tabella Ordini quando viene modificata la corrispondente colonna ClienteID nella tabella Clienti.
A partire da SQL Server 2005 è possibile impostare a NULL oppure ad un valore di DEFAULT la colonna ClienteID nella tabella Ordini quando viene eliminato un cliente dalla tabella Clienti.

Sui Books Online troverai tutti i dettagli:
http://technet.microsoft.com/en-us/library/ms175464.aspx

>SCUSA ANCORA
Di cosa?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

luxsor Profilo | Guru

Ti ringrazio per la tua disponibilità, sei stato chiarissimo.
Grazie.....
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5