Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Esplorazione dei diversi vincoli in SQL Server

I vincoli in SQL Server sono regole predefinite che puoi applicare a una o più colonne. Questi vincoli aiutano a mantenere l'integrità, l'affidabilità e l'accuratezza dei valori archiviati in queste colonne. È possibile creare vincoli utilizzando le istruzioni CREATE TABLE o ALTER Table. Se si utilizza l'istruzione ALTER TABLE, SQL Server verificherà i dati delle colonne esistenti prima di creare il vincolo.

Se si inseriscono dati nella colonna che soddisfa i criteri della regola di vincolo, SQL Server inserisce i dati correttamente. Tuttavia, se i dati violano il vincolo, l'istruzione insert viene interrotta con un messaggio di errore.

Ad esempio, considera di avere una tabella [Impiegato] che memorizza i dati dei dipendenti della tua organizzazione, incluso il loro stipendio. Ci sono alcune regole pratiche quando si tratta di valori nella colonna dello stipendio.

  • La colonna non può avere valori negativi come -10.000 o -15.000 USD.
  • Vuoi anche specificare il valore salariale massimo. Ad esempio, lo stipendio massimo dovrebbe essere inferiore a 2.000.000 USD.

Se inserisci un nuovo record con un vincolo, SQL Server convaliderà il valore rispetto alle regole definite.

Valore inserito:

Stipendio 80.000:Inserito con successo

Stipendio -50.000: Errore

Esploreremo i seguenti vincoli in SQL Server in questo articolo.

  • NON NULLO
  • UNICO
  • CONTROLLA
  • CHIAVE PRIMARIA
  • CHIAVE ESTERA
  • DEFAULT

vincolo NOT NULL

Per impostazione predefinita, SQL Server consente di archiviare i valori NULL nelle colonne. Questi valori NULL non rappresentano dati validi.

Ad esempio, ogni dipendente di un'organizzazione deve disporre di un ID operatore, nome, sesso e indirizzo. Pertanto, puoi specificare una colonna con vincoli NOT NULL per garantire sempre valori validi.

Lo script CREATE TABLE seguente definisce i vincoli NOT NULL per le colonne [ID], [Nome], [Cognome], [Sesso] e [Indirizzo].

CREATE TABLE Employees
(
ID INT NOT NULL,
[FirstName] Varchar(100) NOT NULL,
[MiddleName] Varchar(50) NULL,
[LastName] Varchar(100) NOT NULL,
[Gender] char(1) NOT NULL,
[Address] Varchar(200) NOT NULL
)

Per convalidare i vincoli NOT NULL, il comportamento, utilizziamo le seguenti istruzioni INSERT.

  • Inserisci valori per tutte le colonne (NULL e NOT NULL) – Inserimento riuscito
INSERT INTO Employees (ID,[FirstName],[MiddleName],[LastName],[gender],[Address]) VALUES(1,'Raj','','Gupta','M','India')
  • Inserisci valori per colonne con proprietà NOT NULL – Inserimento riuscito
INSERT INTO Employees (ID,[FirstName],[LastName],[gender],[Address]) VALUES(2,
'Shyam','Agarwal','M','UK')
  • Salta l'inserimento di valori per la colonna [LastName] con vincoli NOT NULL – Fails+
INSERT INTO Employees (ID,[FirstName],[gender],[Address]) VALUES(3,'Sneha','F','India')

L'ultima istruzione INSERT ha generato l'errore: Impossibile inserire valori NULL nella colonna .

Questa tabella ha i seguenti valori inseriti nella tabella [Dipendenti].

Supponiamo di non richiedere valori NULL nella colonna [MiddleName] secondo i requisiti delle risorse umane. A tale scopo, puoi utilizzare l'istruzione ALTER TABLE.

ALTER TABLE Employees
ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL

Questa istruzione ALTER TABLE ha esito negativo a causa dei valori esistenti della colonna [MiddleName]. Per applicare il vincolo, è necessario eliminare questi valori NULL e quindi eseguire l'istruzione ALTER.

UPDATE Employees SET [MiddleName]='' WHERE [MiddleName] IS NULL
Go
ALTER TABLE Employees
ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL

Puoi anche convalidare i vincoli NOT NULL utilizzando il designer di tabelle SSMS.

vincolo UNICO

Il vincolo UNIQUE in SQL Server garantisce che non siano presenti valori duplicati in una singola colonna o in una combinazione di colonne. Queste colonne dovrebbero far parte dei vincoli UNIQUE. SQL Server crea automaticamente un indice quando vengono definiti vincoli UNIQUE. Puoi avere un solo valore univoco nella colonna (incluso NULL).

Ad esempio, crea la [DemoTable] con la colonna [ID] con vincolo UNIQUE.

CREATE TABLE DemoTable
(
[ID] INT UNIQUE NOT NULL,
[EmpName] VARCHAR(50) NOT NULL
)

Quindi, espandi la tabella in SSMS e avrai un indice univoco (non cluster), come mostrato di seguito.

Fare clic con il pulsante destro del mouse sull'indice e generare il suo script. Come mostrato di seguito, utilizza la parola chiave ADD UNIQUE NONCLUSTERED per il vincolo.

La seguente istruzione insert fornisce un errore perché tenta di inserire valori duplicati.

INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj')
GO
INSERT INTO DemoTable ([ID],[EmpName]) VALUES (2,'Alisha')
GO
INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj')
GO

CONTROLLA vincolo

Il vincolo CHECK in SQL Server definisce un intervallo di valori valido che può essere inserito in colonne specificate. Valuta ogni valore inserito o modificato e, se è soddisfatto, l'istruzione SQL viene completata correttamente.

Il seguente script SQL pone un vincolo per la colonna [Età]. Il suo valore dovrebbe essere maggiore di 18 anni.

CREATE TABLE DemoCheckConstraint
(
ID INT PRIMARY KEY,
[EmpName] VARCHAR(50) NULL,
[Age] INT CHECK (Age>18)
)
GO

Inseriamo due record in questa tabella. La query inserisce il primo record correttamente.

INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (1,'Raj',20)
Go
INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (2,'Sohan',17)
GO

La seconda istruzione INSERT ha esito negativo perché non soddisfa la condizione di vincolo CHECK.

Un altro caso d'uso per il vincolo CHECK consiste nel memorizzare valori validi di codici postali. Nello script seguente, aggiungiamo una nuova colonna [ZipCode] e utilizza il vincolo CHECK per convalidare i valori.

ALTER TABLE DemoCheckConstraint ADD zipcode int
GO
ALTER TABLE DemoCheckConstraint
ADD CONSTRAINT CK_zipcode CHECK (zipcode LIKE REPLICATE ('[0-9]', 5))

Questo vincolo CHECK non consente codici postali non validi. Ad esempio, la seconda istruzione INSERT genera un errore.

INSERT INTO DemoCheckConstraint values(3,'Sneha',19,30203)
Go
INSERT INTO DemoCheckConstraint values(4,'Jenny',21,122102)

vincolo CHIAVE PRIMARIA

Il vincolo PRIMARY KEY in SQL Server è una scelta popolare tra i professionisti del database per l'implementazione di valori univoci in una tabella relazionale. Combina i vincoli UNIQUE e NOT NULL. SQL Server crea automaticamente un indice cluster una volta definito un vincolo PRIMARY KEY. Puoi utilizzare una singola colonna o un insieme di combinazioni per definire valori univoci in una riga.

Il suo scopo principale è rafforzare l'integrità della tabella utilizzando l'entità univoca o il valore della colonna.

È simile al vincolo UNIQUE con le seguenti differenze.

CHIAVE PRIMARIA CHIAVE UNICA
Utilizza un identificatore univoco per ogni riga di una tabella. Definisce in modo univoco i valori in una colonna di tabella.
Non puoi inserire valori NULL nella colonna CHIAVE PRIMARIA. Può accettare un valore NULL nella colonna chiave univoca.
Una tabella può avere un solo vincolo PRIMARY KEY. Puoi creare più vincoli UNIQUE KEY in SQL Server.
Per impostazione predefinita, crea un indice cluster per le colonne PRIMARY KEY. La CHIAVE UNICA crea un indice non in cluster per le colonne della chiave primaria.

Lo script seguente definisce la CHIAVE PRIMARIA nella colonna ID.

CREATE TABLE PrimaryKeyDemo
(
ID INT PRIMARY KEY,
[Name] VARCHAR(100) NULL
)

Come mostrato di seguito, hai un indice di chiave cluster dopo aver definito la CHIAVE PRIMARIA nella colonna ID.

Inseriamo i record nella tabella [PrimaryKeyDemo] con le seguenti istruzioni INSERT.

INSERT INTO PrimaryKeyDemo ([ID],[NAME]) VALUES (1,'Raj')
GO
INSERT INTO PrimaryKeyDemo ([NAME]) VALUES ('Mohan')
GO

Viene visualizzato un errore nella seconda istruzione INSERT perché tenta di inserire il valore NULL.

Allo stesso modo, se si tenta di inserire valori duplicati, viene visualizzato il seguente messaggio di errore.

vincolo CHIAVE ESTERA

Il vincolo FOREIGN KEY in SQL Server crea relazioni tra due tabelle. Questa relazione è nota come relazione genitore-figlio. Impone l'integrità referenziale in SQL Server.

La chiave esterna della tabella figlio deve avere una voce corrispondente nella colonna della chiave primaria padre. Non è possibile inserire valori nella tabella figlio senza inserirla prima nella tabella padre. Allo stesso modo, in primo luogo, dobbiamo rimuovere il valore dalla tabella figlio prima che possa essere eliminato dalla tabella padre.

Poiché non possiamo avere valori duplicati nel vincolo PRIMARY KEY, non consente duplicati o NULL anche nella tabella figlio.

Il seguente script SQL crea una tabella padre con una chiave primaria e una tabella figlio con un riferimento di chiave primaria ed esterna alla colonna [EmpID] della tabella padre.

CREATE TABLE ParentTable
(
[EmpID] INT PRIMARY KEY,
[Name] VARCHAR(50) NULL
)
GO
CREATE TABLE ChildTable
(
[ID] INT PRIMARY KEY,
[EmpID] INT FOREIGN KEY REFERENCES ParentTable(EmpID)
)

Inserisci i record in entrambe le tabelle. Si noti che il valore della chiave esterna della tabella figlio ha una voce nella tabella padre.

INSERT INTO ParentTable VALUES (1,'Raj'),(2,'Komal')
INSERT INTO ChildTable VALUES (101,1),(102,2)

Se si tenta di inserire un record direttamente nella tabella figlio che non fa riferimento alla chiave primaria della tabella padre, viene visualizzato il seguente messaggio di errore.

vincolo PREDEFINITO

Il vincolo DEFAULT in SQL Server fornisce il valore predefinito per una colonna. Se non specifichiamo un valore nell'istruzione INSERT per la colonna con il vincolo DEFAULT, SQL Server utilizza il valore assegnato predefinito. Si supponga, ad esempio, che una tabella ordini contenga record per tutti gli ordini dei clienti. Puoi utilizzare la funzione GETDATE() per acquisire la data dell'ordine senza specificare alcun valore esplicito.

CREATE TABLE Orders
(
[OrderID] INT PRIMARY KEY,
[OrderDate] DATETIME NOT NULL DEFAULT GETDATE()
)
GO

Per inserire i record in questa tabella, possiamo saltare l'assegnazione dei valori per la colonna [OrderDate].

INSERT INTO Orders([OrderID]) values (1)
GO

SELEZIONA * DA Ordini

Dopo che la colonna del vincolo DEFAULT specifica un valore esplicito, SQL Server archivia questo valore esplicito anziché il valore predefinito.

Vantaggi dei vincoli

I vincoli in SQL Server possono essere utili nei seguenti casi:

  • Applicazione della logica aziendale
  • Applicazione dell'integrità referenziale
  • Impedire la memorizzazione di dati impropri nelle tabelle di SQL Server
  • Applicazione dell'unicità per i dati delle colonne
  • Miglioramento delle prestazioni delle query poiché Query Optimizer è a conoscenza di dati univoci e convalida set di valori
  • Impedire la memorizzazione di valori NULL nelle tabelle SQL
  • Scrittura di codici per evitare NULL durante la visualizzazione dei dati nell'applicazione