DB2 - Vincoli

Questo capitolo descrive vari vincoli nel database.

introduzione

Per applicare l'integrità del database, viene definito un insieme di regole, chiamate vincoli. I vincoli consentono o vietano i valori nelle colonne.

In un'attività di database in tempo reale, i dati dovrebbero essere aggiunti con alcune restrizioni. Ad esempio, in un database di vendita, sales-id o transaction-id dovrebbe essere univoco. I tipi di vincoli sono:

  • NON NULLO
  • Unique
  • Chiave primaria
  • Chiave esterna
  • Check
  • Informational

I vincoli sono associati solo alle tabelle. Si applicano solo a tabelle particolari. Sono definiti e applicati alla tabella al momento della creazione della tabella.

Spiegazione di ogni vincolo:

NON NULLO

È una regola proibire valori nulli da una o più colonne all'interno della tabella.

Syntax:

db2 create table <table_name>(col_name col_type not null,..)

Example: [Per creare una tabella delle vendite, con quattro colonne (id, itemname, qty, price) aggiungendo vincoli "not null" a tutte le colonne per evitare di formare celle nulle nella tabella.]

db2 create table shopper.sales(id bigint not null, itemname 
varchar(40) not null, qty int not null,price double not null)

Inserimento di valori NOT NULL nella tabella

È possibile inserire valori nella tabella come mostrato di seguito:

Example: [Query ERRORE]

db2 insert into shopper.sales(id,itemname,qty) 
values(1,'raagi',12)

Output: [Query corretta]

DB21034E  The command was processed as an SQL statement because 
it was not a 

valid Command Line Processor command.  During SQL processing 
it returned: 

SQL0407N  Assignment of a NULL value to a NOT NULL column 
"TBSPACEID=5, 

TABLEID=4, COLNO=3" is not allowed.  SQLSTATE=23502

Example: [Query corretta]

db2 insert into shopper.sales(id,itemname,qty,price) 
values(1,'raagi',12, 120.00)  

db2 insert into shopper.sales(id,itemname,qty,price) 
values(1,'raagi',12, 120.00)

Output:

DB20000I The SQL command completed successfully.

Vincoli unici

Utilizzando questi vincoli, è possibile impostare i valori delle colonne in modo univoco. Per questo, i vincoli univoci vengono dichiarati con il vincolo "non nullo" al momento della creazione della tabella.

Syntax:

db2 create table <tab_name>(<col> <col_type> not null unique, ...)

Example:

db2 create table shopper.sales1(id bigint not null unique, 
itemname varchar(40) not null, qty int not null,price 
double not null)

Inserimento dei valori nella tabella

Example: Per inserire quattro righe differenti con ID univoci come 1, 2, 3 e 4.

db2 insert into shopper.sales1(id, itemname, qty, price) 
values(1, 'sweet', 100, 89)  

db2 insert into shopper.sales1(id, itemname, qty, price) 
values(2, 'choco', 50, 60)  

db2 insert into shopper.sales1(id, itemname, qty, price) 
values(3, 'butter', 30, 40)  

db2 insert into shopper.sales1(id, itemname, qty, price) 
values(4, 'milk', 1000, 12)

Example: Per inserire una nuova riga con valore "id" 3

db2 insert into shopper.sales1(id, itemname, qty, price) 
values(3, 'cheese', 60, 80)

Output: quando provi a inserire una nuova riga con un valore id esistente, mostrerà questo risultato:

DB21034E  The command was processed as an SQL statement 
because it was not a 

valid Command Line Processor command.  During 
SQL processing it returned: 

SQL0803N  One or more values in the INSERT statement, 
UPDATE statement, or foreign key update caused by a
DELETE statement are not valid because the primary key, 
unique constraint or unique index identified by "1" constrains 
table "SHOPPER.SALES1" from having duplicate values for the 
index key. SQLSTATE=23505

Chiave primaria

Analogamente ai vincoli univoci, è possibile utilizzare un vincolo "chiave primaria" e un vincolo "chiave esterna" per dichiarare le relazioni tra più tabelle.

Syntax:

db2 create table <tab_name>( 
      
       ,.., primary key ()) 
      

Example: Per creare una tabella "salesboys" con "sid" come chiave primaria

db2 create table shopper.salesboys(sid int not null, name 
varchar(40) not null, salary double not null, constraint 
pk_boy_id primary key (sid))

Chiave esterna

Una chiave esterna è un insieme di colonne in una tabella che devono corrispondere ad almeno una chiave primaria di una riga in un'altra tabella. È un vincolo referenziale o un vincolo di integrità referenziale. È una regola logica sui valori in più colonne in una o più tabelle. Consente la relazione richiesta tra le tabelle.

In precedenza, hai creato una tabella denominata "shopper.salesboys". Per questa tabella, la chiave primaria è "sid". Ora stai creando una nuova tabella che ha i dettagli personali del venditore con uno schema diverso denominato "dipendente" e una tabella denominata "commesso". In questo caso, "sid" è la chiave esterna.

Syntax:

db2 create table <tab_name>(<col> <col_type>,constraint 
<const_name> foreign key (<col_name>)  
                  reference <ref_table> (<ref_col>)

Example: [Per creare una tabella denominata "salesboys" con la colonna della chiave esterna "sid"]

db2 create table employee.salesboys( 
            sid int,  
            name varchar(30) not null,  
            phone int not null,  
            constraint fk_boy_id  
            foreign key (sid)  
            references shopper.salesboys (sid) 
			 on delete restrict 
                       )

Example: [Inserimento di valori nella tabella della chiave primaria "shopper.salesboys"]

db2 insert into shopper.salesboys values(100,'raju',20000.00), 
(101,'kiran',15000.00), 
(102,'radha',10000.00), 
(103,'wali',20000.00), 
(104,'rayan',15000.00)

Example: [Inserimento di valori nella tabella di chiavi esterne "dipendente.salesboys" [senza errori]]

db2 insert into employee.salesboys values(100,'raju',98998976), 
(101,'kiran',98911176), 
(102,'radha',943245176), 
(103,'wali',89857330),  
(104,'rayan',89851130)

Se hai inserito un numero sconosciuto, che non è memorizzato nella tabella "shopper.salesboys", ti verrà mostrato un errore SQL.

Example: [errore di esecuzione]

db2 insert into employee.salesboys values(105,'rayan',89851130)

Output:

DB21034E  The command was processed as an SQL statement because it 
was not a valid Command Line Processor command.  During SQL 
processing it returned: SQL0530N  The insert or update value of 
the FOREIGN KEY "EMPLOYEE.SALESBOYS.FK_BOY_ID" is not equal to any 
value of the parent key of the parent table.  SQLSTATE=23503

Controllo del vincolo

È necessario utilizzare questo vincolo per aggiungere restrizioni condizionali per una colonna specifica in una tabella.

Syntax:

db2 create table 
      
        (
        
        
          primary key (
         
          ), constraint 
          
            check (condition or condition) ) 
          
         
        
       
      

Example: [To create emp1 table with constraints values]

db2 create table empl                                                     
 (id           smallint not null,                                         
  name         varchar(9),                                                
  dept         smallint check (dept between 10 and 100), 
  job          char(5)  check (job in ('sales', 'mgr', 'clerk')), 
  hiredate     date,                                                      
  salary       decimal(7,2),                                              
  comm         decimal(7,2),                                              
  primary key (id),                                                       
  constraint yearsal check (year(hiredate) > 1986 or salary > 40500)  
 )
 

Inserting values

You can insert values into a table as shown below:

db2 insert into empl values (1,'lee', 15, 'mgr', '1985-01-01' , 
40000.00, 1000.00) 

Dropping the constraint

Let us see the syntaxes for dropping various constraints.

Dropping UNIQUE constraint

Syntax:

db2 alter table <tab_name> drop unique <const_name>

Dropping primary key

Syntax:

db2 alter table <tab_name> drop primary key 

Dropping check constraint

Syntax:

db2 alter table <tab_name> drop check <check_const_name>  

Dropping foreign key

Syntax:

db2 alter table <tab_name> drop foreigh key <foreign_key_name>