Oracle PL/SQL/Constraints/Create Foreign Key

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

Add constraint foreign key references

   <source lang="sql">
 

SQL> SQL> create table parts

 2  (part_no   number primary key,
 3   part_name varchar2(20),
 4   parent number);

Table created. SQL> SQL> insert into parts

 2  values (4, "part1" , 3)
 3  /

1 row created. SQL> SQL> insert into parts

 2  values (5, "part2" , 3)
 3  /

1 row created. SQL> SQL> insert into parts

 2  values (6, "part3" , 3)
 3  /

1 row created. SQL> SQL> insert into parts

 2  values (7, "part4" , 6)
 3  /

1 row created. SQL> SQL> insert into parts

 2  values (10, "part5" , null)
 3  /

1 row created. SQL> SQL> insert into parts

 2  values (2, "part6" , 10)
 3  /

1 row created. SQL> SQL> insert into parts

 2  values (3, "part7" , 10)
 3  /

1 row created. SQL> SQL> alter table parts

 2  add constraint fk_parent foreign key (parent) references parts;

Table altered. SQL> SQL> SQL> drop table parts; Table dropped.


 </source>
   
  


Create a foreign key with more than one field

   <source lang="sql">

SQL> SQL> -- create a foreign key with more than one field as in the example below: SQL> SQL> CREATE TABLE supplier

 2      (      supplier_id     numeric(10)     not null,
 3             supplier_name   varchar2(50)    not null,
 4             contact_name    varchar2(50),
 5             CONSTRAINT supplier_pk PRIMARY KEY (supplier_id, supplier_name)
 6      );

Table created. SQL> SQL> SQL> CREATE TABLE products

 2      (      product_id      numeric(10)     not null,
 3             supplier_id     numeric(10)     not null,
 4             supplier_name   varchar2(50)    not null,
 5             CONSTRAINT fk_supplier_comp
 6               FOREIGN KEY (supplier_id, supplier_name)
 7               REFERENCES supplier(supplier_id, supplier_name)
 8      );

Table created. SQL> SQL> desc products;

Name                                                                                                  Null?    Type
----------------------------------------------------------------------------------------------------- -------- --------------------------------------------------------------------
PRODUCT_ID                                                                                            NOT NULL NUMBER(10)
SUPPLIER_ID                                                                                           NOT NULL NUMBER(10)
SUPPLIER_NAME                                                                                         NOT NULL VARCHAR2(50)

SQL> desc supplier;

Name                                                                                                  Null?    Type
----------------------------------------------------------------------------------------------------- -------- --------------------------------------------------------------------
SUPPLIER_ID                                                                                           NOT NULL NUMBER(10)
SUPPLIER_NAME                                                                                         NOT NULL VARCHAR2(50)
CONTACT_NAME                                                                                           VARCHAR2(50)

SQL> SQL> drop table products cascade constraints; Table dropped. SQL> drop table supplier cascade constraints; Table dropped. SQL> SQL>


 </source>
   
  


Create table with foreign key

   <source lang="sql">

SQL> SQL> -- create a foreign key SQL> SQL> CREATE TABLE supplier

 2      (      supplier_id     numeric(10)     not null,
 3             supplier_name   varchar2(50)    not null,
 4             contact_name    varchar2(50),
 5             CONSTRAINT supplier_pk PRIMARY KEY (supplier_id)
 6      );

Table created. SQL> SQL> SQL> CREATE TABLE products

 2      (      product_id      numeric(10)     not null,
 3             supplier_id     numeric(10)     not null,
 4             CONSTRAINT fk_supplier
 5               FOREIGN KEY (supplier_id)
 6               REFERENCES supplier(supplier_id)
 7      );

Table created. SQL> SQL> SQL> SQL> desc products;

Name                                                                                                  Null?    Type
----------------------------------------------------------------------------------------------------- -------- --------------------------------------------------------------------
PRODUCT_ID                                                                                            NOT NULL NUMBER(10)
SUPPLIER_ID                                                                                           NOT NULL NUMBER(10)

SQL> desc supplier;

Name                                                                                                  Null?    Type
----------------------------------------------------------------------------------------------------- -------- --------------------------------------------------------------------
SUPPLIER_ID                                                                                           NOT NULL NUMBER(10)
SUPPLIER_NAME                                                                                         NOT NULL VARCHAR2(50)
CONTACT_NAME                                                                                           VARCHAR2(50)

SQL> SQL> drop table products cascade constraints; Table dropped. SQL> SQL> drop table supplier cascade constraints; Table dropped. SQL>


 </source>
   
  


Declaring a Foreign Key

   <source lang="sql">
 

SQL> SQL> SQL> CREATE TABLE myTable (myTableID INT PRIMARY KEY NOT NULL,

 2                       Name VARCHAR(50));

Table created. SQL> SQL> CREATE TABLE Phone (

 2     PhoneID INT PRIMARY KEY NOT NULL,
 3     myTableID INT,
 4     PhoneNo VARCHAR(20),
 5     CONSTRAINT FID_FK FOREIGN KEY(myTableID)
 6        REFERENCES myTable(myTableID));

Table created.


 </source>
   
  


Referential Integrity Constraints

   <source lang="sql">
 

SQL> SQL> create table department (

 2      Dept_no  NUMBER(3) primary key,
 3      Dept_name   VARCHAR2(15),
 4      Location     VARCHAR2(25),
 5      CONSTRAINT Dept_name_ukey UNIQUE (Dept_Name,Location));

Table created. SQL> SQL> SQL> create table employee (

 2  Employee_id    number (7),
 3  Last_name      varchar2(30),
 4  First_name     varchar2(30),
 5  Job            varchar2(15),
 6  Department_id  number (3) NOT NULL
 7                 Constraint dept_fkey REFERENCES department(dept_NO));

Table created. SQL> SQL> drop table employee cascade constraints; Table dropped. SQL> drop table department cascade constraints; Table dropped. SQL>

 </source>
   
  


Violate a foreign key

   <source lang="sql">
 

SQL> SQL> create table p ( pk int primary key )

 2  /

Table created. SQL> create table c

 2  ( fk  constraint c_fk
 3        references p(pk)
 4        deferrable
 5        initially immediate
 6  )
 7  /

Table created. SQL> insert into p values ( 1 ); 1 row created. SQL> insert into c values ( 1 ); 1 row created. SQL> SQL> update p set pk = 2; update p set pk = 2

ERROR at line 1: ORA-02292: integrity constraint (sqle.C_FK) violated - child record found

SQL> SQL> set constraint c_fk deferred; Constraint set. SQL> SQL> update p set pk = 2; 1 row updated. SQL> SQL> set constraint c_fk immediate; set constraint c_fk immediate

ERROR at line 1: ORA-02291: integrity constraint (sqle.C_FK) violated - parent key not found

SQL> SQL> update c set fk = 2; 1 row updated. SQL> SQL> set constraint c_fk immediate; Constraint set. SQL> SQL> drop table p; drop table p

          *

ERROR at line 1: ORA-02449: unique/primary keys in table referenced by foreign keys

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


 </source>