Oracle
 sql >> Database >  >> RDS >> Oracle

Come creare un vincolo non nullo in Oracle

Cos'è il vincolo non nullo in Oracle

I vincoli Not Null in Oracle vengono utilizzati per imporre valori non null nella colonna della tabella. Quindi, se provi a inserire null in quella colonna, verrà generato un errore.

Come creare un vincolo non nullo

I vincoli Non null vengono definiti al momento della creazione della tabella oppure è possibile modificare la tabella, in seguito, per modificare una colonna in Non null. Diamo un'occhiata agli esempi.

Creazione tabella
Viene specificato un vincolo non null in linea con la colonna.

SQL> CREATE TABLE "EMP"
    ("EMPNO" NUMBER(4,0) Not Null,
     "ENAME" VARCHAR2(10) Not null,
     "JOB" VARCHAR2(9),  
     "MGR" NUMBER(4,0),       
     "HIREDATE" DATE,
     "SAL" NUMBER(7,2) ,  
     "COMM" NUMBER(7,2),
     "DEPTNO" NUMBER(2,0)
      );

 Table created. 

Qui abbiamo definito due vincoli non nulli sulla tabella emp. Possiamo controllare i vincoli Not null sulla tabella usando la query seguente

SQL> column CONSTRAINT_NAME format a20
SQL> column SEARCH_CONDITION format a50
SQL> SELECT Constraint_name, Search_condition
     FROM User_constraints
     WHERE Table_name = 'EMP'  AND    
     Constraint_type = 'C';

I vincoli Not Null sono anche definiti come vincoli di controllo e hanno condizioni di ricerca come nome della colonna non null

Aggiunta Nessun vincolo dopo la creazione della tabella

Possiamo modificare la tabella per aggiungere il vincolo non nullo

SQL> alter table emp modify ("HIREDATE" not null);
 Table altered.

Se nella colonna sono presenti dati nulli, questa istruzione avrà esito negativo

SQL> SELECT Constraint_name, Search_condition
     FROM User_constraints
     WHERE Table_name = 'EMP'  AND
     Constraint_type = 'C'

Possiamo anche assegnare il nome personalizzato al vincolo Not Null. Ecco l'esempio per dimostrarlo

SQL> CREATE TABLE "EMP"
 ("EMPNO" NUMBER(4,0) Constraint EMP_NOTNULL Not Null,  
 "ENAME" VARCHAR2(10) Not null,
 "JOB" VARCHAR2(9),
 "MGR" NUMBER(4,0),
 "HIREDATE" DATE,
 "SAL" NUMBER(7,2) ,
 "COMM" NUMBER(7,2),
 "DEPTNO" NUMBER(2,0)
  );

 Table created.
 SQL> column CONSTRAINT_NAME format a20
 SQL> column SEARCH_CONDITION format a50
 SQL> SELECT Constraint_name, Search_condition
     FROM User_constraints
     WHERE Table_name = 'EMP'  AND
     Constraint_type = 'C';
 SQL> alter table emp modify ("HIREDATE" Constraint H_NOTNULL  Not    Null);
 
Table altered.
 SQL> SELECT Constraint_name, Search_condition
      FROM User_constraints
      WHERE Table_name = 'EMP'  AND
      Constraint_type = 'C';

Come eliminare il vincolo Not Null

Dobbiamo modificare la colonna per accettare valori null

SQL>alter table emp modify "HIREDATE" Null;

Table altered.

SQL> SELECT Constraint_name, Search_condition
     FROM User_constraints
     WHERE Table_name = 'EMP'  AND
     Constraint_type = 'C';

Possiamo anche eliminare il vincolo non nullo usando il comando alter table drop vincolo

SQL> alter table emp drop constraint  EMP_NOTNULL ;
Table altered;

SQL> SELECT Constraint_name, Search_condition
     FROM User_constraints
     WHERE Table_name = 'EMP'  AND
     Constraint_type = 'C';

Come aggiungere un vincolo non nullo sulla colonna contenente valori nulli

Se si tenta di aggiungere un vincolo non nullo sulla colonna contenente valori null, quel comando non riuscirà poiché convaliderà tutte le righe tutte le righe esistenti per il vincolo non nullo. A volte vogliamo mantenere i valori nulli esistenti e verificare che le righe future contengano un valore non nullo per questa colonna, quindi, in tal caso, possiamo abilitare il vincolo con la clausola novalidate. Con questa clausola non verranno controllate le righe esistenti, ma verranno controllate le righe future

alter table emp modify "HIREDATE" not Null novalidate;

Leggi anche
rilascia chiave primaria oracle
Chiave esterna in Oracle
vincolo chiave univoca in Oracle
come controllare tutti i vincoli su una tabella in Oracle
oracle altera tabella modifica tipo di colonna
https://docs.oracle.com/cd/B28359_01/server.111/b28310/general005.htm#ADMIN11554