Oracle PL/SQL/Constraints/Add Foreign Key
Содержание
Add Foreign Primary Key
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>
SQL>
SQL> -- Using table aliases in joins
SQL>
SQL> SELECT e.Employee_ID, e.Start_Date,
2 e.Employee_Name,d.Department_Name, d.Location
3 FROM Employee e, Department d
4 WHERE d.Deparment_ID = e.Deparment_ID;
EMPLOYEE_ID START_DAT EMPLOYEE_N DEPARTMENT_NAM LOCATION
----------- --------- ---------- -------------- -------------
7369 17-DEC-80 SMITH RESEARCH DALLAS
7499 20-FEB-81 ALLEN SALES CHICAGO
7521 22-FEB-81 WARD SALES CHICAGO
7566 02-APR-81 JONES RESEARCH DALLAS
7654 28-SEP-81 MARTIN SALES CHICAGO
7698 01-MAY-81 BLAKE SALES CHICAGO
7782 09-JUN-81 CLARK ACCOUNTING NEW YORK
7788 09-DEC-82 SCOTT RESEARCH DALLAS
7839 17-NOV-81 KING ACCOUNTING NEW YORK
7844 08-SEP-81 TURNER SALES CHICAGO
7876 12-JAN-83 ADAMS RESEARCH DALLAS
EMPLOYEE_ID START_DAT EMPLOYEE_N DEPARTMENT_NAM LOCATION
----------- --------- ---------- -------------- -------------
7900 03-DEC-81 JAMES SALES CHICAGO
7902 03-DEC-81 FORD RESEARCH DALLAS
7934 23-JAN-82 MILLER ACCOUNTING NEW YORK
14 rows selected.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> drop table Department cascade constraints;
Table dropped.
SQL> drop table Employee cascade constraints;
Table dropped.
SQL>
SQL>
Alter table to add primary key and alter another table to add foreign key
SQL>
SQL>
SQL> create table subjects (
2 subject_id number not null,
3 subject_name varchar2(30) not null,
4 description varchar2(4000)
5 )
6 tablespace users;
Table created.
SQL>
SQL> alter table subjects
2 add constraint pk_subjects primary key (subject_id);
Table altered.
SQL>
SQL> create table courses (
2 course_id number not null,
3 course_name varchar2(60) not null,
4 subject_id number not null,
5 duration number(2),
6 skill_lvl varchar2(12) not null
7 )
8 tablespace users;
Table created.
SQL>
SQL> alter table courses
2 add constraint pk_courses
3 primary key (course_id);
Table altered.
SQL>
SQL> alter table courses
2 add constraint fk_course_subj
3 foreign key (subject_id) references subjects (subject_id);
Table altered.
SQL>
SQL> alter table courses
2 add constraint ck_level check(
3 skill_lvl in ("BEGINNER", "INTERMEDIATE", "ADVANCED")
4 );
Table altered.
SQL>
SQL> drop table courses cascade constraints;
Table dropped.
SQL> drop table subjects cascade constraints;
Table dropped.
SQL>
Many to many using a primary-key and foreign-key relationship
SQL> CREATE TABLE Course
2 (course_id VARCHAR2(10) NOT NULL,
3 course_name VARCHAR2(20),
4 PRIMARY KEY (course_id));
Table created.
SQL>
SQL> CREATE TABLE emp
2 (stud_id VARCHAR2(10) NOT NULL,
3 stud_name VARCHAR2(20),
4 PRIMARY KEY (stud_id));
Table created.
SQL>
SQL> CREATE TABLE Enrolls_in
2 (course_id VARCHAR2(10) NOT NULL,
3 stud_id VARCHAR2(10) NOT NULL,
4 PRIMARY KEY (course_id, stud_id),
5 FOREIGN KEY (course_id) REFERENCES Course (course_id)
6 ON DELETE CASCADE,
7 FOREIGN KEY (stud_id) REFERENCES emp (stud_id)
8 ON DELETE CASCADE);
Table created.
SQL>
SQL> drop table Course cascade constraints;
Table dropped.
SQL> drop table emp cascade constraints;
Table dropped.
SQL> drop table Enrolls_in;
Table dropped.
SQL>
One to many using a primary-key and foreign-key relationship
SQL>
SQL>
SQL> CREATE TABLE Programmer
2 (lect_id VARCHAR2(10) NOT NULL,
3 lect_name VARCHAR2(20),
4 PRIMARY KEY (lect_id));
Table created.
SQL>
SQL> CREATE TABLE Course
2 (course_id VARCHAR2(10) NOT NULL,
3 course_name VARCHAR2(20),
4 lect_id VARCHAR(10),
5 PRIMARY KEY (course_id),
6 FOREIGN KEY (lect_id) REFERENCES Programmer (lect_id)
7 ON DELETE CASCADE);
Table created.
SQL>
SQL> drop table Programmer cascade constraints;
Table dropped.
SQL> drop table Course cascade constraints;
Table dropped.
syntax to reference foreign key
SQL>
SQL>
SQL> --CREATE TABLE <table schema> OF <object schema>
SQL> -- (key attribute NOT NULL,
SQL> -- attribute attribute type,
SQL> -- PRIMARY KEY (key attribute),
SQL> -- FOREIGN KEY (key attribute)
SQL> -- REFERENCES <referenced table schema>(key attribute)
SQL> -- [ON DELETE][CASCADE|SET NULL]);
SQL>
SQL> --Example:
SQL>
SQL> CREATE TABLE emp
2 (id VARCHAR2(10) NOT NULL,
3 course VARCHAR2(10),
4 year VARCHAR2(4),
5 PRIMARY KEY (id),
6 FOREIGN KEY (id) REFERENCES Person ON DELETE CASCADE);
SQL> FOREIGN KEY (id) REFERENCES Person ON DELETE CASCADE)
SP2-0734: unknown command beginning "FOREIGN KE..." - rest of line ignored.
SQL>
SQL>
SQL>
SQL>
Three foreign keys in a table
SQL> CREATE TABLE store (
2 store_id VARCHAR2(12) CONSTRAINT store_pk PRIMARY KEY,
3 store_name VARCHAR2(15),
4 city VARCHAR2(25),
5 state VARCHAR2(2),
6 region VARCHAR2(2),
7 zip VARCHAR2(5));
Table created.
SQL>
SQL> CREATE TABLE pc (
2 pc_id VARCHAR2(12) CONSTRAINT prod_pk PRIMARY KEY,
3 prod_desc VARCHAR2(15),
4 upc NUMBER,
5 brand VARCHAR2(12),
6 category VARCHAR2(12),
7 department VARCHAR2(12));
Table created.
SQL>
SQL> CREATE TABLE promotion (
2 promo_id varchar2(12) CONSTRAINT promo_pk PRIMARY KEY,
3 promo_name varchar2(15),
4 promo_type varchar2(12));
Table created.
SQL>
SQL> CREATE TABLE FinancialYear (
2 time_id DATE CONSTRAINT time_pk PRIMARY KEY,
3 month NUMBER,
4 quarter NUMBER,
5 year NUMBER,
6 season VARCHAR2(12));
Table created.
SQL>
SQL> CREATE TABLE SALES (
2 time_id DATE NOT NULL CONSTRAINT time_fk REFERENCES FinancialYear(time_id),
3 store_id VARCHAR2(12) NOT NULL CONSTRAINT store_fk REFERENCES store(store_id),
4 pc_id VARCHAR2(12) NOT NULL,
5 promo_id VARCHAR2(12) NOT NULL CONSTRAINT promo_fk REFERENCES promotion(promo_id),
6 units NUMBER,
7 dollars NUMBER,
8 cost NUMBER,
9 CONSTRAINT sales_pk PRIMARY KEY (time_id, store_id, pc_id, promo_id)
10 );
Table created.
SQL>
SQL>
SQL> drop table sales;
Table dropped.
SQL> drop table FinancialYear;
Table dropped.
SQL> drop table promotion;
Table dropped.
SQL> drop table pc;
Table dropped.
SQL> drop table store;
Table dropped.