Oracle PL/SQL/Constraints/NOT NULL

Материал из SQL эксперт
Перейти к: навигация, поиск

Adding constraint that checks values and prohobits nulls

   <source lang="sql">
  

SQL> SQL> CREATE TABLE purchase (

 2       product_name  VARCHAR2(25),
 3       product_price NUMBER(4,2),
 4       purchase_date DATE
 5       );

Table created. SQL> SQL> ALTER TABLE purchase ADD (

 2       CONSTRAINT reasonable_date CHECK(
 3            purchase_date IS NOT NULL
 4            AND
 5            TO_CHAR(purchase_date, "YYYY-MM-DD") >= "2000-06-30"
 6            )
 7       );

Table altered. SQL> SQL> INSERT INTO purchase VALUES ("Small Widget", 10, "28-FEB-00"); INSERT INTO purchase VALUES ("Small Widget", 10, "28-FEB-00")

ERROR at line 1: ORA-02290: check constraint (sqle.REASONABLE_DATE) violated

SQL> SQL> SQL> SQL> drop table purchase; Table dropped.


 </source>
   
  


Add not null constraint to different columns

   <source lang="sql">
 

SQL> create table myTable (

 2        id                   number(8) not null,
 3        code                 number(4) not null,
 4        inception            date not null,
 5        description          varchar2(60) not null,
 6        price                number(6,2) not null,
 7        in_stock             varchar2(1)
 8  );

Table created. SQL> SQL> drop table myTable; Table dropped.


 </source>
   
  


alter table dept modify emp_count NOT NULL

   <source lang="sql">
 

SQL> SQL> CREATE TABLE EMP(

 2      EMPNO NUMBER(4) NOT NULL,
 3      ENAME VARCHAR2(10),
 4      JOB VARCHAR2(9),
 5      MGR NUMBER(4),
 6      HIREDATE DATE,
 7      SAL NUMBER(7, 2),
 8      COMM NUMBER(7, 2),
 9      DEPTNO NUMBER(2)
10  );

SQL> SQL> INSERT INTO EMP VALUES(7369, "SMITH", "CLERK", 7902,TO_DATE("17-DEC-1980", "DD-MON-YYYY"), 800, NULL, 20); SQL> INSERT INTO EMP VALUES(7499, "ALLEN", "SALESMAN", 7698,TO_DATE("20-FEB-1981", "DD-MON-YYYY"), 1600, 300, 30); SQL> INSERT INTO EMP VALUES(7521, "WARD", "SALESMAN", 7698,TO_DATE("22-FEB-1981", "DD-MON-YYYY"), 1250, 500, 30); SQL> INSERT INTO EMP VALUES(7566, "JONES", "MANAGER", 7839,TO_DATE("2-APR-1981", "DD-MON-YYYY"), 2975, NULL, 20); SQL> INSERT INTO EMP VALUES(7654, "MARTIN", "SALESMAN", 7698,TO_DATE("28-SEP-1981", "DD-MON-YYYY"), 1250, 1400, 30); SQL> INSERT INTO EMP VALUES(7698, "BLAKE", "MANAGER", 7839,TO_DATE("1-MAY-1981", "DD-MON-YYYY"), 2850, NULL, 30); SQL> INSERT INTO EMP VALUES(7782, "CLARK", "MANAGER", 7839,TO_DATE("9-JUN-1981", "DD-MON-YYYY"), 2450, NULL, 10); SQL> INSERT INTO EMP VALUES(7788, "SCOTT", "ANALYST", 7566,TO_DATE("09-DEC-1982", "DD-MON-YYYY"), 3000, NULL, 20); SQL> INSERT INTO EMP VALUES(7839, "KING", "PRESIDENT", NULL,TO_DATE("17-NOV-1981", "DD-MON-YYYY"), 5000, NULL, 10); SQL> INSERT INTO EMP VALUES(7844, "TURNER", "SALESMAN", 7698,TO_DATE("8-SEP-1981", "DD-MON-YYYY"), 1500, 0, 30); SQL> INSERT INTO EMP VALUES(7876, "ADAMS", "CLERK", 7788,TO_DATE("12-JAN-1983", "DD-MON-YYYY"), 1100, NULL, 20); SQL> INSERT INTO EMP VALUES(7900, "JAMES", "CLERK", 7698,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 950, NULL, 30); SQL> INSERT INTO EMP VALUES(7902, "FORD", "ANALYST", 7566,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 3000, NULL, 20); SQL> INSERT INTO EMP VALUES(7934, "MILLER", "CLERK", 7782,TO_DATE("23-JAN-1982", "DD-MON-YYYY"), 1300, NULL, 10); SQL> SQL> CREATE TABLE DEPT(

 2      DEPTNO NUMBER(2),
 3      DNAME VARCHAR2(14),
 4      LOC VARCHAR2(13)
 5  );

SQL> SQL> INSERT INTO DEPT VALUES (10, "ACCOUNTING", "NEW YORK"); SQL> INSERT INTO DEPT VALUES (20, "RESEARCH", "DALLAS"); SQL> INSERT INTO DEPT VALUES (30, "SALES", "CHICAGO"); SQL> INSERT INTO DEPT VALUES (40, "OPERATIONS", "BOSTON"); SQL> SQL> SQL> alter table dept

 2  add emp_count number
 3  constraint must_be_between_3_8
 4  check(emp_count between 3 and 8 OR emp_count = 0)
 5  deferrable initially deferred;

SQL> SQL> update dept set emp_count = (select count(*) from emp where emp.deptno = dept.deptno )

 2  /

SQL> SQL> alter table dept

 2  modify emp_count NOT NULL;

SQL> SQL> create trigger emp_dept_cnt_trigger

 2  after insert or update or delete on emp
 3  for each row
 4  begin
 5      if ( updating and :old.deptno = :new.deptno )
 6      then
 7          return;
 8      end if;
 9      if ( inserting or updating )
10      then
11          update dept set emp_count = emp_count+1
12           where deptno = :new.deptno;
13      end if;
14      if ( updating or deleting )
15      then
16          update dept set emp_count = emp_count-1
17           where deptno = :old.deptno;
18      end if;
19  end;
20  /

SQL> SQL> drop table emp; SQL> drop table dept; SQL>


 </source>
   
  


Change a column to "not null" with null data in it

   <source lang="sql">
  

SQL> SQL> CREATE TABLE employees

 2  ( employee_id          number(10)      not null,
 3    last_name            varchar2(50)      not null,
 4    email                varchar2(30),
 5    hire_date            date,
 6    job_id               varchar2(30),
 7    department_id        number(10),
 8    salary               number(6),
 9    manager_id           number(6)
10  );

Table created. SQL> SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary,department_id ,manager_id)

 2                values ( 1001, "Lawson", "lawson@g.ru", "01-JAN-2002","MGR", 30000,1 ,1004);

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id ,manager_id)

 2                values ( 1002, "Wells", "wells@g.ru", "01-JAN-2002", "DBA", 20000,2, 1005 );

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id ,manager_id)

 2                 values( 1003, "Bliss", "bliss@g.ru", "01-JAN-2002", "PROG", 24000,3 ,1004);

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id, manager_id)

 2                 values( 1004,  "Kyte", "tkyte@a.ru", SYSDATE-3650, "MGR",25000 ,4, 1005);

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id, manager_id)

 2                 values( 1005, "Viper", "sdillon@a .ru", SYSDATE, "PROG", 20000, 1, 1006);

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id,manager_id)

 2                 values( 1006, "Beck", "clbeck@g.ru", SYSDATE, "PROG", 20000, 2, null);

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id, manager_id)

 2                 values( 1007, "Java", "java01@g.ru", SYSDATE, "PROG", 20000, 3, 1006);

1 row created. SQL> SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salary, department_id, manager_id)

 2                 values( 1008, "Oracle", "oracle1@g.ru", SYSDATE, "DBA", 20000, 4, 1006);

1 row created. SQL> SQL> select * from employees; EMPLOYEE_ID LAST_NAME EMAIL HIRE_DATE JOB_ID DEPARTMENT_ID SALARY MANAGER_ID


-------------------------------------------------- ------------------------------ --------- ------------------------------ ------------- ---------- ----------
      1001 Lawson                                             lawson@g.ru                   01-JAN-02 MGR                                        1      30000       1004
      1002 Wells                                              wells@g.ru                    01-JAN-02 DBA                                        2      20000       1005
      1003 Bliss                                              bliss@g.ru                    01-JAN-02 PROG                                       3      24000       1004
      1004 Kyte                                               tkyte@a.ru                    14-JUN-98 MGR                                        4      25000       1005
      1005 Viper                                              sdillon@a .ru                 11-JUN-08 PROG                                       1      20000       1006
      1006 Beck                                               clbeck@g.ru                   11-JUN-08 PROG                                       2      20000
      1007 Java                                               java01@g.ru                   11-JUN-08 PROG                                       3      20000       1006
      1008 Oracle                                             oracle1@g.ru                  11-JUN-08 DBA                                        4      20000       1006

8 rows selected. SQL> SQL> alter table employees

 2      add (
 3        ssn       number(9)
 4  )
 5  /

Table altered. SQL> SQL> update employees

 2  set ssn = 123456789
 3  where employee_id = 1;

0 rows updated. SQL> SQL> update employees

 2  set ssn = 234567890
 3  where employee_id = 2;

0 rows updated. SQL> SQL> update employees

 2  set ssn = 345678901
 3  where employee_id = 3;

0 rows updated. SQL> SQL> alter table employees

 2  modify (
 3     ssn number(9) not null
 4  );

alter table employees

ERROR at line 1: ORA-02296: cannot enable (SYS.) - null values found

SQL> SQL> drop table employees; Table dropped. SQL> SQL> SQL>


 </source>
   
  


Create a SQL collection type that disallows null values

   <source lang="sql">
 

SQL> SQL> CREATE OR REPLACE TYPE integer_varray

 2    AS VARRAY(100) OF INTEGER NOT NULL;
 3  /

Type created. SQL> SQL> DECLARE

 2    intArray INTEGER_VARRAY := integer_varray();
 3  BEGIN
 4    FOR i IN 1..intArray.LIMIT LOOP
 5      intArray.EXTEND;
 6    END LOOP;
 7    dbms_output.put_line("["||intArray.COUNT||"]");
 8  END;
 9  /

[100] PL/SQL procedure successfully completed. SQL>


 </source>
   
  


NOT NULL Column Constraints

   <source lang="sql">
  

SQL> SQL> create table people(

 2    employee_id     number(9),
 3    first_name      varchar2(15),
 4    last_name       varchar2(20),
 5    email           varchar2(25),
 6    constraint pk_people primary key (employee_id)
 7  );

Table created. SQL> SQL> insert into people values (1, "T", "Kyte", "YourName@q.ru"); 1 row created. SQL> SQL> insert into people values (2, "S", "Viper", "sdillon@q.ru"); 1 row created. SQL> SQL> insert into people values (3, "C", "Beck", "clbeck@q.ru"); 1 row created. SQL> SQL> commit; Commit complete. SQL> SQL> select * from people; EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL


--------------- -------------------- -------------------------
         1 T               Kyte                 YourName@q.ru
         2 S               Viper                sdillon@q.ru
         3 C               Beck                 clbeck@q.ru

SQL> SQL> SQL> alter table people

 2  add (
 3    ssn       number(9)
 4  );

Table altered. SQL> SQL> update people set ssn = 123456789 where employee_id = 1; 1 row updated. SQL> SQL> update people set ssn = 234567890 where employee_id = 2; 1 row updated. SQL> SQL> update people set ssn = 345678901 where employee_id = 3; 1 row updated. SQL> SQL> alter table people

 2  modify (
 3    ssn number(9) not null
 4  );

Table altered. SQL> SQL> desc people;

Name                                                                                                      Null?    Type
----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
EMPLOYEE_ID                                                                                               NOT NULL NUMBER(9)
FIRST_NAME                                                                                                         VARCHAR2(15)
LAST_NAME                                                                                                          VARCHAR2(20)
EMAIL                                                                                                              VARCHAR2(25)
SSN                                                                                                       NOT NULL NUMBER(9)

SQL> SQL> drop table people; Table dropped. SQL> SQL>


 </source>
   
  


NOT NULL CONSTRAINT

   <source lang="sql">
  

SQL> SQL> CREATE TABLE person (

 2       person_code VARCHAR2(3),
 3       first_name  VARCHAR2(15),
 4       last_name   VARCHAR2(20),
 5       hire_date   DATE
 6       );

Table created. SQL> SQL> SQL> SQL> ALTER TABLE person MODIFY (first_name NOT NULL); Table altered. SQL> ALTER TABLE person MODIFY (last_name NOT NULL); Table altered. SQL> SQL> INSERT INTO person VALUES ("XL", "Xaviera", NULL, "15-NOV-03"); INSERT INTO person VALUES ("XL", "Xaviera", NULL, "15-NOV-03")

                                           *

ERROR at line 1: ORA-01400: cannot insert NULL into ("sqle"."PERSON"."LAST_NAME")

SQL> SQL> drop table person; Table dropped. SQL> SQL>


 </source>
   
  


ORA-01400: cannot insert NULL into

   <source lang="sql">
 

SQL> SQL> CREATE TABLE emp (

 2    emp_id               NUMBER,
 3    ename             VARCHAR2(40),
 4    hire_date        DATE DEFAULT sysdate,
 5    end_date DATE,
 6    rate     NUMBER(5,2),
 7    CONSTRAINT emp_pk    PRIMARY KEY (emp_id)
 8  );

Table created. SQL> INSERT INTO emp(emp_id, ename, hire_date,end_date, rate)VALUES (101, "Mary", to_date("15-Nov-1961","dd-mon-yyyy"),null,169); 1 row created. SQL> INSERT INTO emp(emp_id, ename, hire_date,end_date, rate)VALUES (102, "Tom", to_date("16-Sep-1964","dd-mon-yyyy"),to_date("5-May-2004","dd-mon-yyyy"),135); 1 row created. SQL> INSERT INTO emp(emp_id, ename, hire_date,end_date, rate)VALUES (104, "Peter", to_date("29-Dec-1987","dd-mon-yyyy"),to_date("1-Apr-2004","dd-mon-yyyy"),99); 1 row created. SQL> INSERT INTO emp(emp_id, ename, hire_date,end_date, rate)VALUES (105, "Mike", to_date("15-Jun-2004","dd-mon-yyyy"),null,121); 1 row created. SQL> INSERT INTO emp(emp_id, ename, hire_date,end_date, rate)VALUES (107, "Less", to_date("2-Jan-2004","dd-mon-yyyy"),null,45); 1 row created. SQL> INSERT INTO emp(emp_id, ename, hire_date,end_date, rate)VALUES (108, "Park", to_date("1-Mar-1994","dd-mon-yyyy"),to_date("15-Nov-2004","dd-mon-yyyy"),220); 1 row created. SQL> INSERT INTO emp(emp_id, ename, hire_date,end_date, rate)VALUES (110, "Ink", to_date("4-Apr-2004","dd-mon-yyyy"),to_date("30-Sep-2004","dd-mon-yyyy"),84); 1 row created. SQL> INSERT INTO emp(emp_id, ename, hire_date,end_date, rate)VALUES (111, "Tike", to_date("23-Aug-1976","dd-mon-yyyy"),null,100); 1 row created. SQL> INSERT INTO emp(emp_id, ename, hire_date,end_date, rate)VALUES (112, "Inn", to_date("15-Nov-1961","dd-mon-yyyy"),to_date("4-Apr-2004","dd-mon-yyyy"),70); 1 row created. SQL> INSERT INTO emp(emp_id, ename, hire_date,end_date, rate)VALUES (113, "Kate", to_date("3-Mar-2004","dd-mon-yyyy"),to_date("31-Oct-2004","dd-mon-yyyy"),300); 1 row created. SQL> SQL> SET ECHO ON SQL> INSERT INTO emp (ename) VALUES ("Kyta"); INSERT INTO emp (ename) VALUES ("Kyta")

ERROR at line 1: ORA-01400: cannot insert NULL into ("sqle"."EMP"."EMP_ID")

SQL> SQL> drop table emp; Table dropped.


 </source>