Press "Enter" to skip to content

3 – Creare i vincoli di Primary Key in un database

 

Questo articolo ci spiega come generare il vincolo più importante in una tabella database, la chiave primaria, (Primary Key) che è un vincolo di univocità per le righe della tabella. Tale vincolo permetterà poi di creare le relazioni fra le tabelle collegandole tramite l’uso di Foreign Keys (Chiavi esterne).

Nel post precedente, abbiamo creato le tabelle del database, adesso, indichiamo qual’è per loro l’indice univoco che individua una riga della tabella in modo esatto. Questo vincolo è indispensabile se vogliamo poi utilizzare ADO.Net per inserire e modificare dati all’interno del database, perché se non è presente non è in grado di funzionare.

Vediamo lo script

IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID('[dbo].[TbIngredients]') AND name = 'PK_TbIngredients') BEGIN
	PRINT 'CREATE PK_TbIngredients ON TbIngredients';
	ALTER TABLE [dbo].[TbIngredients] ADD CONSTRAINT [PK_TbIngredients] PRIMARY KEY CLUSTERED ([IDIngredient] ASC) ON [PRIMARY];
END
GO

IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID('[dbo].[TbMeasureUnits]') AND name = 'PK_TbMeasureUnits') BEGIN
	PRINT 'CREATE PK_TbMeasureUnits ON TbMeasureUnits';
	ALTER TABLE [dbo].[TbMeasureUnits] ADD CONSTRAINT [PK_TbMeasureUnits] PRIMARY KEY CLUSTERED ([IDMeasureUnit] ASC) ON [PRIMARY];
END
GO

IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID('[dbo].[TbRecipeIngredients]') AND name = 'PK_TbRecipeIngredients') BEGIN
	PRINT 'CREATE PK_TbRecipeIngredients ON TbRecipeIngredients';
	ALTER TABLE [dbo].[TbRecipeIngredients] ADD CONSTRAINT [PK_TbRecipeIngredients] PRIMARY KEY CLUSTERED ([IDRecipeIngredient] ASC) ON [PRIMARY];
END
GO

IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID('[dbo].[TbRecipeLinks]') AND name = 'PK_TbRecipeLinks') BEGIN
	PRINT 'CREATE PK_TbRecipeLinks ON TbRecipeLinks';
	ALTER TABLE [dbo].[TbRecipeLinks] ADD CONSTRAINT [PK_TbRecipeLinks] PRIMARY KEY CLUSTERED ([IDRecipeLink] ASC) ON [PRIMARY];
END
GO

IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID('[dbo].[TbRecipes]') AND name = 'PK_TbRecipes') BEGIN
	PRINT 'CREATE PK_TbRecipes ON TbRecipes';
	ALTER TABLE [dbo].[TbRecipes] ADD CONSTRAINT [PK_TbRecipes] PRIMARY KEY CLUSTERED ([IDRecipe] ASC) ON [PRIMARY];
END
GO

IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID('[dbo].[TbVersions]') AND name = 'PK_TbVersions') BEGIN
	PRINT 'CREATE PK_TbVersions ON TbVersions';
	ALTER TABLE [dbo].[TbVersions] ADD CONSTRAINT [PK_TbVersions] PRIMARY KEY CLUSTERED ([IDVersion] DESC) ON [PRIMARY];
END
GO

Prima di generare una chiave primaria verifichiamo se esiste, le chiavi primarie, come tutti gli indici delle tabelle possono essere trovate sulla vista di sistema sys.indexes, per individuare l’indice che ci interessa, utilizziamo la funzione OBJECT_ID fornita dal sistema che può ottenere l’identificativo di un oggetto a partire dal nome della tabella.

Perché inserire questo controllo quando sappiamo che abbiamo appena generato le tabelle? Perché così, anche se qualcuno lo eseguisse due volte, lo script non darebbe alcun errore e non farebbe alcun danno. Non solo, se per qualche motivo una chiave primaria fosse stata cancellata magari per errore, verrebbe automaticamente ripristinata.

Conclusioni

Abbiamo creato il database nel nostro server, abbiamo creato le tabelle che lo compongono, ed ora abbiamo aggiunto le Primary Keys a tutte le tabelle, nella prossima puntata aggiungeremo tutti gli altri vincoli al database.

Gli script T-SQL del codice di esempio sono scaricabili al seguente link e sono comprensivi di tutto quello che è spiegato nella breve serie di articoli.