none
Creare relazione uno ad uno in Sql RRS feed

  • 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?

    venerdì 18 ottobre 2013 15:46

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/

    sabato 19 ottobre 2013 11:41
    Moderatore

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/

    sabato 19 ottobre 2013 11:41
    Moderatore
  • Ottima spiegazione. Esaustiva!

    sabato 19 ottobre 2013 17:41