Principale utente con più risposte
Creare relazione uno ad uno in Sql

Domanda
-
Buongiorno ho iniziato a studiare le relazioni tra le tabelle in Sql Server. Ho la seguente tabella:
CREATE TABLE dbo.Customers( CustomerID int NOT NULL PRIMARY KEY, Cognome varchar(10) NOT NULL, Nome varchar(10) NOT NULL, );
con la tabella dettagli
CREATE TABLE dbo.CustomersDetails( CustomerID int PRIMARY KEY, Indirizzo varchar(10) NOT NULL, );
Come posso creare tra loro la relazione uno ad uno?
Risposte
-
salve,
ti basta aggiungere un vincolo di FOREIGN KEY nella definizione della tabella, che puoi effettuare sia nel CREATE TABLE che con un successivo ALTER TABLE, similarmente a
SET NOCOUNT ON; USE tempdb; GO CREATE TABLE dbo.Customers ( CustomerId int PRIMARY KEY, Cognome varchar(10) NOT NULL, Nome varchar(10) NOT NULL, ); CREATE TABLE dbo.CustomersDetails( CustomerID int PRIMARY KEY CONSTRAINT fk_CustomersDetails$has$Customers FOREIGN KEY REFERENCES dbo.Customers (CustomerId) ON UPDATE CASCADE ON DELETE CASCADE, Indirizzo varchar(10) NOT NULL, ); GO PRINT 'Inserimento funzionante di Cliente e singolo dettaglio'; INSERT INTO dbo.Customers VALUES ( 1, 'Montanari', 'Andrea' ); INSERT INTO dbo.CustomersDetails VALUES ( 1, 'Riccione' ); PRINT 'Proiezione di Cliente e singolo dettaglio'; SELECT * FROM dbo.Customers c LEFT JOIN dbo.CustomersDetails cd ON cd.CustomerID = c.CustomerId GO DROP TABLE dbo.CustomersDetails, dbo.Customers;
che diventa
SET NOCOUNT ON; USE tempdb; GO CREATE TABLE dbo.Customers ( CustomerId int PRIMARY KEY, Cognome varchar(10) NOT NULL, Nome varchar(10) NOT NULL, ); CREATE TABLE dbo.CustomersDetails( CustomerID int PRIMARY KEY, Indirizzo varchar(10) NOT NULL, ); GO ALTER TABLE dbo.CustomersDetails WITH CHECK ADD CONSTRAINT fk_CustomersDetails$has$Customers FOREIGN KEY(CustomerId) REFERENCES dbo.Customers (CustomerId) ON UPDATE CASCADE ON DELETE CASCADE ALTER TABLE dbo.CustomersDetails CHECK CONSTRAINT fk_CustomersDetails$has$Customers GO DROP TABLE dbo.CustomersDetails, dbo.Customers;
nel caso di ALTER TABLE...
molto spesso viene preferito creare i vincoli di integrita' referenziale successivamente alla creazione delle tabelle in modo da non dover dipendere dall'ordine stesso di creazione delle stesse, in quanto ovviamente CustomerDetails NON potra' essere generata prima di Customers. Avrai in questo caso uno script di "soli" CREATE TABLE, con altro script da eseguirsi successivamente di ALTER TABLE, contenente i vincoli di integrita' referenziale...
saluti
http://www.hotelsole.com/asql/index.php - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/
- Proposto come risposta Alessandro AlpiMVP, Moderator sabato 19 ottobre 2013 12:12
- Contrassegnato come risposta piedatt80 sabato 19 ottobre 2013 17:41
Tutte le risposte
-
salve,
ti basta aggiungere un vincolo di FOREIGN KEY nella definizione della tabella, che puoi effettuare sia nel CREATE TABLE che con un successivo ALTER TABLE, similarmente a
SET NOCOUNT ON; USE tempdb; GO CREATE TABLE dbo.Customers ( CustomerId int PRIMARY KEY, Cognome varchar(10) NOT NULL, Nome varchar(10) NOT NULL, ); CREATE TABLE dbo.CustomersDetails( CustomerID int PRIMARY KEY CONSTRAINT fk_CustomersDetails$has$Customers FOREIGN KEY REFERENCES dbo.Customers (CustomerId) ON UPDATE CASCADE ON DELETE CASCADE, Indirizzo varchar(10) NOT NULL, ); GO PRINT 'Inserimento funzionante di Cliente e singolo dettaglio'; INSERT INTO dbo.Customers VALUES ( 1, 'Montanari', 'Andrea' ); INSERT INTO dbo.CustomersDetails VALUES ( 1, 'Riccione' ); PRINT 'Proiezione di Cliente e singolo dettaglio'; SELECT * FROM dbo.Customers c LEFT JOIN dbo.CustomersDetails cd ON cd.CustomerID = c.CustomerId GO DROP TABLE dbo.CustomersDetails, dbo.Customers;
che diventa
SET NOCOUNT ON; USE tempdb; GO CREATE TABLE dbo.Customers ( CustomerId int PRIMARY KEY, Cognome varchar(10) NOT NULL, Nome varchar(10) NOT NULL, ); CREATE TABLE dbo.CustomersDetails( CustomerID int PRIMARY KEY, Indirizzo varchar(10) NOT NULL, ); GO ALTER TABLE dbo.CustomersDetails WITH CHECK ADD CONSTRAINT fk_CustomersDetails$has$Customers FOREIGN KEY(CustomerId) REFERENCES dbo.Customers (CustomerId) ON UPDATE CASCADE ON DELETE CASCADE ALTER TABLE dbo.CustomersDetails CHECK CONSTRAINT fk_CustomersDetails$has$Customers GO DROP TABLE dbo.CustomersDetails, dbo.Customers;
nel caso di ALTER TABLE...
molto spesso viene preferito creare i vincoli di integrita' referenziale successivamente alla creazione delle tabelle in modo da non dover dipendere dall'ordine stesso di creazione delle stesse, in quanto ovviamente CustomerDetails NON potra' essere generata prima di Customers. Avrai in questo caso uno script di "soli" CREATE TABLE, con altro script da eseguirsi successivamente di ALTER TABLE, contenente i vincoli di integrita' referenziale...
saluti
http://www.hotelsole.com/asql/index.php - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/
- Proposto come risposta Alessandro AlpiMVP, Moderator sabato 19 ottobre 2013 12:12
- Contrassegnato come risposta piedatt80 sabato 19 ottobre 2013 17:41
-