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

Vincolo SQL DEFAULT per inserire una colonna con un valore predefinito nella tabella di SQL Server

Per inserire dati in una tabella con colonne con vincoli predefiniti, possiamo utilizzare il vincolo DEFAULT su un valore predefinito in una tabella. Questo articolo tratterà i seguenti aspetti:

  • Il vincolo DEFAULT e l'autorizzazione richiesta per crearli.
  • Aggiunta di un vincolo DEFAULT durante la creazione di una nuova tabella.
  • Aggiunta di un vincolo DEFAULT in una tabella esistente.
  • Modifica e visualizzazione della definizione del vincolo mediante script T-SQL e SSMS.

Che cos'è il VINCOLO PREDEFINITO in SQL Server?

Un vincolo predefinito specifica il valore predefinito per la colonna.

Quando eseguiamo l'istruzione INSERT ma non specifichiamo alcun valore per la colonna con il vincolo predefinito creato, SQL Server inserisce il valore predefinito specificato nella definizione del vincolo DEFAULT.

Per creare un vincolo predefinito, è necessaria l'autorizzazione ALTER TABLE e CREATE TABLE.

Aggiunta di un vincolo DEFAULT durante la creazione di una nuova tabella

Esiste una tabella denominata SalesDetails . Quando inseriamo i dati nella tabella senza specificare il Sale_Qty valore della colonna, la query deve inserire zero. Per farlo, sto creando un vincolo predefinito denominato DF_SalesDetails_SaleQty nella Qtà_vendita colonna.

USE demodatabase 
go 
CREATE TABLE salesdetails 
  ( 
     id           INT IDENTITY (1, 1), 
     product_code VARCHAR(10), 
     sale_qty     INT CONSTRAINT df_salesdetails_saleqty DEFAULT 0 
  ) 

Ora, testiamo il comportamento del vincolo inserendo alcuni record fittizi al suo interno. Esegui la seguente query:

INSERT INTO salesdetails 
            (product_code) 
VALUES     ('PROD0001')

Utilizza la query seguente per visualizzare i dati dalla tabella:

INSERT INTO salesdetails 
            (product_code) 
VALUES     ('PROD0001')

Uscita

Come puoi vedere, lo zero è stato inserito nella Sale_Qty colonna.

Durante la creazione di una tabella, non specifichiamo il nome del vincolo DEFAULT. SQL Server crea un vincolo con un nome univoco generato dal sistema.

Crea la tabella utilizzando la query seguente:

USE demodatabase 
go 
CREATE TABLE salesdetails 
  ( 
     id           INT IDENTITY (1, 1), 
     product_code VARCHAR(10), 
     sale_qty     INT DEFAULT 0 
  )

Esegui il seguente script per visualizzare il nome del vincolo:

SELECT NAME             [Constraint name], 
       parent_object_id [Table Name], 
       type_desc        [Object Type], 
       definition       [Constraint Definition] 
FROM   sys.default_constraints 

Uscita

SQL Server ha creato un vincolo con il nome generato dal sistema.

Aggiunta di un vincolo DEFAULT nella tabella esistente

Per aggiungere un vincolo su una colonna esistente della tabella, utilizziamo ALTER TABLE ADD CONSTRAINT dichiarazione:

ALTER TABLE [tbl_name] 
  ADD CONSTRAINT [constraint_name] DEFAULT [default_value] FOR [Column_name]

Nella sintassi,

  • nome_tbl :specifica il nome della tabella in cui vuoi aggiungere il vincolo di default.
  • nome_vincolo :specifica il nome del vincolo desiderato.
  • nome_colonna: specifica il nome della colonna in cui vuoi creare il vincolo predefinito.
  • valore_predefinito: specifica il valore che vuoi inserire:un numero intero, un carattere o una stringa di caratteri.

Quando non specifichiamo il valore del nome_colonna nell'istruzione INSERT, inserisce il valore specificato nel valore_predefinito parametro.

Innanzitutto, aggiungiamo il Nome_prodotto colonna in Dettagli vendite :

ALTER TABLE salesdetails 
  ADD product_name VARCHAR(500) 

Inseriamo i dati nella tabella senza specificare il valore della colonna Product_name. La query deve inserire N/D .

Per farlo, sto creando un vincolo predefinito denominato DF_SalesDetails_ProductName su Nome_prodotto colonna. La query seguente crea un vincolo predefinito:

ALTER TABLE dbo.salesdetails 
  ADD CONSTRAINT df_salesdetails_productname DEFAULT 'N/A' FOR product_name 

Osserviamo ora il comportamento del vincolo. Inserisci un record senza specificare il nome del prodotto:

INSERT INTO salesdetails 
            (product_code, 
             product_name, 
             sale_qty) 
VALUES     ('PROD0002', 
            'Dell Optiplex 7080', 
            20) 

INSERT INTO salesdetails 
            (product_code, 
             sale_qty) 
VALUES     ('PROD0003', 
            50)

Una volta inserito il record, eseguire la query SELECT per visualizzare i dati:

USE demodatabase 
go 
SELECT * 
FROM   salesdetails 
go

Uscita

Come puoi vedere nell'immagine sopra, il valore del Nome_prodotto colonna per PROD0003 è N/D .

Modifica del vincolo DEFAULT utilizzando script T-SQL

Possiamo modificare la definizione del vincolo predefinito:prima, elimina il vincolo esistente e poi crea il vincolo con una definizione diversa.

Supponiamo, invece di inserire N/A , vogliamo inserire Non applicabile . Innanzitutto, dobbiamo eliminare DF_SalesDetails_ProductName vincolo. Esegui la seguente query:

ALTER TABLE dbo.salesdetails 
  DROP CONSTRAINT df_salesdetails_productname

Quando il vincolo viene eliminato, esegui la query per creare il vincolo:

ALTER TABLE dbo.salesdetails 
  ADD CONSTRAINT df_salesdetails_productname DEFAULT 'Not Applicable' FOR 
  product_name 

Ora inseriamo un record senza specificare il nome del prodotto:

INSERT INTO salesdetails 
            (product_code, 
             sale_qty) 
VALUES     ('PROD0004', 
            10)

Eseguire l'istruzione SELECT per visualizzare i dati da SalesDetails tabella:

USE demodatabase 
go 
SELECT * 
FROM   salesdetails 
go

Uscita

Come puoi vedere, il valore del Nome_prodotto colonna non è applicabile.

Visualizzazione del vincolo PREDEFINITO tramite SSMS

Possiamo visualizzare l'elenco del vincolo DEFAULT utilizzando SQL Server Management Studio e interrogando le viste a gestione dinamica.

Apri SSMS ed espandi Database > DemoDatabase > Dettagli sulle vendite > Vincolo :

Puoi vedere i due vincoli denominati DF_SalesDetails_SaleQty e DF_SalesDetails_ProductName creato.

Un altro modo per visualizzare i vincoli eseguendo una query su sys.default_constraints . La query seguente popola l'elenco dei vincoli predefiniti e le relative definizioni:

SELECT NAME                  [Constraint name], 
       Object_name(parent_object_id)[Table Name], 
       type_desc             [Consrtaint Type], 
       definition            [Constraint Definition] 
FROM   sys.default_constraints

Uscita

Possiamo usare il sp_helpconstraint stored procedure per visualizzare l'elenco dei vincoli creati sulla tabella:

EXEC Sp_helpconstraint 'SalesDetails'

Uscita

I tasti_vincolo la colonna mostra la definizione di vincolo di default.

Rimozione del vincolo

Possiamo eliminare un vincolo in diversi modi. Possiamo farlo utilizzando uno dei seguenti metodi:

  • Istruzione ALTER TABLE DROP CONSTRAINT.
  • Dichiarazione DROP DEFAULT.

Elimina un vincolo usando il comando ALTER TABLE DROP CONSTRAINT

Per eliminare il vincolo, possiamo utilizzare ALTER TABLE DROP CONSTRAINT comando. La sintassi è la seguente:

Alter table [tbl_name] drop constraint [constraint_name]

Nella sintassi,

  • nome_tbl: specifica il nome della tabella che ha una colonna con vincolo predefinito.
  • nome_vincolo: specifica il nome del vincolo che desideri eliminare.

Supponiamo di voler eliminare il DF_SalesDetails_SaleQty vincolo dai SalesDetails tavolo. Esegui la query:

ALTER TABLE dbo.salesdetails 
  DROP CONSTRAINT [DF_SalesDetails_SaleQty] 

Esegui la query seguente per verificare che il vincolo sia stato eliminato:

SELECT NAME                  [Constraint name], 
       Object_name(parent_object_id)[Table Name], 
       type_desc             [Consrtaint Type], 
       definition            [Constraint Definition] 
FROM   sys.default_constraints

Uscita

Il vincolo è stato eliminato.

Rimuovere il vincolo DEFAULT utilizzando l'istruzione DROP DEFAULT

Ora, cerchiamo di capire come rimuovere il vincolo predefinito utilizzando il DROP DEFAULT dichiarazione. La sintassi di DROP DEFAULT dichiarazione è la seguente:

DROP DEFAULT [constraint_name]
  • nome_vincolo: specifica il nome del vincolo che desideri eliminare.

Per eliminare il vincolo utilizzando DROP DEFAULT istruzione, eseguire la seguente query:

IF EXISTS (SELECT NAME 
           FROM   sys.objects 
           WHERE  NAME = 'DF_SalesDetails_ProductName' 
                  AND type = 'D') 
DROP DEFAULT [DF_SalesDetails_ProductName]; 

Riepilogo

Pertanto, abbiamo esaminato diversi aspetti essenziali del lavoro con i vincoli predefiniti. Abbiamo imparato come creare un vincolo predefinito durante la creazione di una nuova tabella o aggiungere un vincolo predefinito su una colonna esistente della tabella.

Inoltre, abbiamo esaminato i casi di modifica della definizione di vincolo di default, di visualizzazione dei dettagli di vincoli di default con mezzi diversi e di eliminazione del vincolo di default.

Ci auguriamo che queste informazioni e gli esempi pratici che abbiamo esaminato possano essere utili nel tuo lavoro.

Leggi anche

SQL INSERT INTO SELECT:5 semplici modi per gestire i duplicati