Oracle PL/SQL/Constraints/Foreign Key
Add Foreign key Demo
SQL> CREATE TABLE Employee(Employee_ID NUMBER(4) NOT NULL,
2 Employee_Name VARCHAR2(10),
3 JOB VARCHAR2(9),
4 Manager_ID NUMBER(4),
5 Start_Date DATE,
6 Salary NUMBER(7, 2),
7 COMM NUMBER(7, 2),
8 Deparment_ID NUMBER(2)
9 );
Table created.
SQL>
SQL> INSERT INTO Employee VALUES (7369, "SMITH", "CLERK", 7902, TO_DATE("17-DEC-1980", "DD-MON-YYYY"), 800, NULL, 20);
1 row created.
SQL> INSERT INTO Employee VALUES (7499, "ALLEN", "SALESMAN", 7698, TO_DATE("20-FEB-1981", "DD-MON-YYYY"), 1600, 300, 30);
1 row created.
SQL> INSERT INTO Employee VALUES (7521, "WARD", "SALESMAN", 7698, TO_DATE("22-FEB-1981", "DD-MON-YYYY"), 1250, 500, 30);
1 row created.
SQL> INSERT INTO Employee VALUES (7566, "JONES", "MANAGER", 7839, TO_DATE("2-APR-1981", "DD-MON-YYYY"), 2975, NULL, 20);
1 row created.
SQL> INSERT INTO Employee VALUES (7654, "MARTIN", "SALESMAN", 7698, TO_DATE("28-SEP-1981", "DD-MON-YYYY"), 1250, 1400, 30);
1 row created.
SQL> INSERT INTO Employee VALUES (7698, "BLAKE", "MANAGER", 7839, TO_DATE("1-MAY-1981", "DD-MON-YYYY"), 2850, NULL, 30);
1 row created.
SQL> INSERT INTO Employee VALUES (7782, "CLARK", "MANAGER", 7839, TO_DATE("9-JUN-1981", "DD-MON-YYYY"), 2450, NULL, 10);
1 row created.
SQL> INSERT INTO Employee VALUES (7788, "SCOTT", "ANALYST", 7566, TO_DATE("09-DEC-1982", "DD-MON-YYYY"), 3000, NULL, 20);
1 row created.
SQL> INSERT INTO Employee VALUES (7839, "KING", "PRESIDENT", NULL, TO_DATE("17-NOV-1981", "DD-MON-YYYY"), 5000, NULL, 10);
1 row created.
SQL> INSERT INTO Employee VALUES (7844, "TURNER", "SALESMAN", 7698, TO_DATE("8-SEP-1981", "DD-MON-YYYY"), 1500, 0, 30);
1 row created.
SQL> INSERT INTO Employee VALUES (7876, "ADAMS", "CLERK", 7788, TO_DATE("12-JAN-1983", "DD-MON-YYYY"), 1100, NULL, 20);
1 row created.
SQL> INSERT INTO Employee VALUES (7900, "JAMES", "CLERK", 7698, TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 950, NULL, 30);
1 row created.
SQL> INSERT INTO Employee VALUES (7902, "FORD", "ANALYST", 7566, TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 3000, NULL, 20);
1 row created.
SQL> INSERT INTO Employee VALUES (7934, "MILLER", "CLERK", 7782, TO_DATE("23-JAN-1982", "DD-MON-YYYY"), 1300, NULL, 10);
1 row created.
SQL>
SQL> CREATE TABLE Department(Deparment_ID NUMBER(2),
2 Department_Name VARCHAR2(14),
3 Location VARCHAR2(13)
4 );
Table created.
SQL>
SQL> INSERT INTO Department VALUES (10, "ACCOUNTING", "NEW YORK");
1 row created.
SQL> INSERT INTO Department VALUES (20, "RESEARCH", "DALLAS");
1 row created.
SQL> INSERT INTO Department VALUES (30, "SALES", "CHICAGO");
1 row created.
SQL> INSERT INTO Department VALUES (40, "OPERATIONS", "BOSTON");
1 row created.
SQL>
SQL> alter table Employee add constraint Employee_pk primary key(Employee_ID);
Table altered.
SQL> alter table Department add constraint Department_pk primary key(Deparment_ID);
Table altered.
SQL> alter table Employee add constraint Employee_fk_Department foreign key(Deparment_ID) references Department;
Table altered.
SQL> alter table Employee add constraint Employee_fk_Employee foreign key(Manager_ID) references Employee;
Table altered.
SQL>
SQL> select * from Employee;
EMPLOYEE_ID EMPLOYEE_N JOB MANAGER_ID START_DAT SALARY COMM DEPARMENT_ID
----------- ---------- --------- ---------- --------- ---------- ---------- ------------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 09-DEC-82 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 12-JAN-83 1100 20
EMPLOYEE_ID EMPLOYEE_N JOB MANAGER_ID START_DAT SALARY COMM DEPARMENT_ID
----------- ---------- --------- ---------- --------- ---------- ---------- ------------
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> select * from Department;
DEPARMENT_ID DEPARTMENT_NAM LOCATION
------------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL>
SQL> drop table Department cascade constraints;
Table dropped.
SQL> drop table Employee cascade constraints;
Table dropped.
SQL>
SQL>
Valiate foreign key example
SQL> create table parent( pk int,
2 constraint parent_pk primary key(pk) );
Table created.
SQL>
SQL> create table child ( fk,
2 constraint child_fk foreign key(fk)
3 references parent deferrable );
Table created.
SQL>
SQL> insert into parent values( 1 );
1 row created.
SQL> insert into child values( 1 );
1 row created.
SQL>
SQL> commit;
Commit complete.
SQL>
SQL> update parent set pk = 2;
update parent set pk = 2
*
ERROR at line 1:
ORA-02292: integrity constraint (sqle.CHILD_FK) violated - child record found
SQL>
SQL> update child set fk = 2;
update child set fk = 2
*
ERROR at line 1:
ORA-02291: integrity constraint (sqle.CHILD_FK) violated - parent key not found
SQL>
SQL> set constraints child_fk deferred;
Constraint set.
SQL>
SQL> update parent set pk=2;
1 row updated.
SQL>
SQL> select * from parent;
PK
----------
2
SQL> select * from child;
FK
----------
1
SQL>
SQL>
SQL> set constraints child_fk deferred;
Constraint set.
SQL> update parent set pk=2;
1 row updated.
SQL>
SQL> select * from parent;
PK
----------
2
SQL> select * from child;
FK
----------
1
SQL>
SQL> set constraints child_fk immediate;
set constraints child_fk immediate
*
ERROR at line 1:
ORA-02291: integrity constraint (sqle.CHILD_FK) violated - parent key not found
SQL> update child set fk = 2;
1 row updated.
SQL> set constraints child_fk immediate;
Constraint set.
SQL>
SQL> select * from parent;
PK
----------
2
SQL> select * from child;
FK
----------
2
SQL>
SQL> drop table parent cascade constraints;
Table dropped.
SQL>
SQL> drop table child cascade constraints;
Table dropped.
SQL>
SQL>
SQL>