Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách sử dụng khóa ngoại trong oracle

Khoá ngoại là gì

Khóa ngoại trong Oracle là một cách để liên kết nhiều Bảng. Nó là một liên kết chéo giữa các bảng.

  • Khoá ngoại là một cột hoặc tập hợp cột tham chiếu đến khoá chính hoặc khoá Duy nhất trong cùng một bảng hoặc một bảng khác
  • Các giá trị khóa ngoại dựa trên các giá trị dữ liệu và chúng hoàn toàn là cấu trúc logic không phải là con trỏ vật lý
  • Giá trị khóa ngoại phải khớp với giá trị khóa chính hoặc giá trị khóa duy nhất hoặc là giá trị rỗng.

Ràng buộc khóa ngoại được gọi là ràng buộc toàn vẹn tham chiếu. Bảng được tham chiếu được gọi là bảng cha trong khi bảng có khóa ngoại được gọi là bảng con.

cách sử dụng khóa ngoại

Hãy kiểm tra với ví dụ về EMP và DEPT.

SQL>CREATE TABLE "DEPT"
 ( "DEPTNO" NUMBER(2,0),
 "DNAME" VARCHAR2(14),
 "LOC" VARCHAR2(13),
 CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
 )
 SQL>CREATE TABLE "EMP"
 ( "EMPNO" NUMBER(4,0),
 "ENAME" VARCHAR2(10),
 "JOB" VARCHAR2(9),
 "MGR" NUMBER(4,0),
 "HIREDATE" DATE,
 "SAL" NUMBER(7,2),
 "COMM" NUMBER(7,2),
 "DEPTNO" NUMBER(2,0),
 CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
 );
 SQL> desc emp
 Name Null? Type
 
 EMPNO NOT NULL NUMBER(4)
 ENAME VARCHAR2(10)
 JOB VARCHAR2(9)
 MGR NUMBER(4)
 HIREDATE DATE
 SAL NUMBER(7,2)
 COMM NUMBER(7,2)
 DEPTNO NUMBER(2)
 SQL>
 SQL> desc dept
 Name Null? Type
 
 DEPTNO NOT NULL NUMBER(2)
 DNAME VARCHAR2(14)
 LOC VARCHAR2(13)
 SQL>
 insert into DEPT values(10, 'ACCOUNTING', 'NEW YORK');
 insert into dept values(20, 'RESEARCH', 'DALLAS');
 insert into dept values(30, 'RESEARCH', 'DELHI');
 insert into dept values(40, 'RESEARCH', 'MUMBAI');
 insert into emp values( 7698, 'Blake', 'MANAGER', 7839, to_date('1-5-2007','dd-mm-yyyy'), 2850, null, 10 );
 insert into emp values( 7782, 'Clark', 'MANAGER', 7839, to_date('9-6-2008','dd-mm-yyyy'), 2450, null, 10 );
 insert into emp values( 7788, 'Scott', 'ANALYST', 7566, to_date('9-6-2012','dd-mm-yyyy'), 3000, null, 20 );
 insert into emp values( 7789, 'TPM', 'ANALYST', 7566, to_date('9-6-2017','dd-mm-yyyy'), 3000, null, null );
 insert into emp values( 7560, 'T1OM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 20 );
 insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, null );
 SQL> select  from emp;
 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
 
 7698 BLAKE MANAGER 7839 01-MAY-07 2850 10
 7782 CLARK MANAGER 7839 09-JUN-08 2450 10
 7788 SCOTT ANALYST 7566 09-JUN-12 3000 20
 7789 TPM ANALYST 7566 09-JUN-17 3000
 7790 TOM ANALYST 7567 09-JUL-17 4000
 7560 T1OM ANALYST 7567 09-JUL-17 4000 20

Bảng EMP chứa cột DEPT_NO. và Bảng DEPT cũng chứa cột DEPT_NO và nó là khóa chính trên bảng.

Bây giờ chúng tôi không muốn bất kỳ mục nhập nào trong bảng EMP mà DEPT_NO không khớp với DEPT_NO trong cột DEPT vì chúng tôi không thể có số trống có Số nợ không tồn tại. Hãy xem liệu chúng ta có thể thực hiện việc này với Thiết lập hiện tại không

SQL> insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 50);
 1 row created.

Nhưng điều này đã thành công và cấu trúc đã gây ra sự cố toàn vẹn dữ liệu

Để tránh những loại vấn đề dữ liệu này, chúng tôi có thể thực thi các ràng buộc Khóa ngoài trên bảng EMP.
Hãy xem lại

drop table emp;
 drop table dept;
 SQL>CREATE TABLE "DEPT"
 ( "DEPTNO" NUMBER(2,0),
 "DNAME" VARCHAR2(14),
 "LOC" VARCHAR2(13),
 CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
 )
 SQL>CREATE TABLE "EMP"
 ( "EMPNO" NUMBER(4,0),
 "ENAME" VARCHAR2(10),
 "JOB" VARCHAR2(9),
 "MGR" NUMBER(4,0),
 "HIREDATE" DATE,
 "SAL" NUMBER(7,2),
 "COMM" NUMBER(7,2),
 "DEPTNO" NUMBER(2,0),
 CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO"),
 CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
 REFERENCES "DEPT" ("DEPTNO") ENABLE
 );
 SQL> desc emp
 Name Null? Type
 
 EMPNO NOT NULL NUMBER(4)
 ENAME VARCHAR2(10)
 JOB VARCHAR2(9)
 MGR NUMBER(4)
 HIREDATE DATE
 SAL NUMBER(7,2)
 COMM NUMBER(7,2)
 DEPTNO NUMBER(2)
 SQL>
 SQL> desc dept
 Name Null? Type
 DEPTNO NOT NULL NUMBER(2)
 DNAME VARCHAR2(14)
 LOC VARCHAR2(13)
 SQL>
 insert into DEPT values(10, 'ACCOUNTING', 'NEW YORK');
 insert into dept values(20, 'RESEARCH', 'DALLAS');
 insert into dept values(30, 'RESEARCH', 'DELHI');
 insert into dept values(40, 'RESEARCH', 'MUMBAI');
 insert into emp values( 7698, 'Blake', 'MANAGER', 7839, to_date('1-5-2007','dd-mm-yyyy'), 2850, null, 10 );
 insert into emp values( 7782, 'Clark', 'MANAGER', 7839, to_date('9-6-2008','dd-mm-yyyy'), 2450, null, 10 );
 insert into emp values( 7788, 'Scott', 'ANALYST', 7566, to_date('9-6-2012','dd-mm-yyyy'), 3000, null, 20 );
 insert into emp values( 7789, 'TPM', 'ANALYST', 7566, to_date('9-6-2017','dd-mm-yyyy'), 3000, null, null );
 insert into emp values( 7560, 'T1OM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 20 );
 insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, null );

Bây giờ chúng ta hãy thử nhập cùng một hàng

SQL> insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 50);
 insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 50)
 *
 ERROR at line 1:
 ORA-02291: integrity constraint (SCOTT.FK_DEPTNO) violated - parent key
 not found

Vì vậy, nó đã tránh được các mục nhập dữ liệu xấu.

Tương tự là kịch bản với Xóa khỏi bảng DEPT. Chúng ta không nên xóa các hàng của thẻ ghi nợ mà emp có một số bản ghi. Nếu không có ràng buộc khóa ngoại, nó sẽ xảy ra và sẽ gây ra dữ liệu xấu. Nhưng với khóa ngoại, điều này sẽ tránh được

SQL>  delete from dept where deptno=10;
  delete from dept where deptno=10
 *
 ERROR at line 1:
 ORA-02292: integrity constraint (SCOTT.FK_DEPTNO) violated - child record found

Các điều khoản khóa ngoại về tùy chọn xóa

CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
 REFERENCES "DEPT" ("DEPTNO") ENABLE
 ON DELETE [CASCADE |SET NULL]

Trường hợp 1: Khóa ngoại được xác định mà không có tùy chọn BẬT XÓA
Bạn sẽ không thể xóa bản ghi khỏi bảng mẹ nếu tìm thấy bản ghi trong bảng con

Trường hợp -2 Khóa ngoại được xác định với tùy chọn ON DELETE SET NULL
Hãy xem nó hoạt động như thế nào

SQL> alter table emp add CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "DEPT" ("DEPTNO") ON DELETE SET NULL;
 Table altered.
 SQL> select * from emp where empno=7698;
   EMPNO     DEPTNO
  -------  ----      
   7698      10
 SQL>  delete from dept where deptno=10;
 1 row deleted.
 SQL> commit;
 Commit complete.
 SQL> select * from emp where empno=7698;
   EMPNO     DEPTNO
  -------  ----      
   7698 

Vì vậy, khi xóa các hàng khỏi bảng mẹ, cột khóa ngoại của các hàng con sẽ bị rỗng

Trường hợp -3 Khóa ngoại được xác định với tùy chọn BẬT XÓA CASCADE

SQL> alter table emp add CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "DEPT" ("DEPTNO") ON DELETE cascade;
 Table altered.
 SQL> delete from dept where deptno=10;
 1 row deleted.
 SQL> commit;
 Commit complete.
 SQL> select * from emp where  deptno=10; ;
 no rows selected
 SQL>

Vì vậy, khi xóa các hàng khỏi bảng mẹ, các hàng con cũng bị xóa

Khóa ngoại của bảng thay thế

Chúng ta có thể tạo khóa ngoại trong Oracle sau khi tạo Bảng cũng được

 alter table emp add CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "DEPT" ("DEPTNO") ; 

Cách bỏ Ràng buộc khóa ngoại

SQL> alter table emp drop constraint "FK_DEPTNO";
 Table altered.

Cách tắt ràng buộc

SQL> alter table emp  disable   constraint "FK_DEPTNO";
 Table altered.

Cách bật ràng buộc

SQL>  alter table emp   enable  constraint "FK_DEPTNO";
 Table altered.
 SQL>

Cũng đã đọc
Kiểm tra ràng buộc trong Oracle
Ràng buộc Not Null trong Oracle
Cách thêm khóa chính trong oracle:khóa chính xác định duy nhất hàng trong bảng. Cách thêm khóa chính trong oracle, cách bỏ khóa chính, cách tạo khóa tổng hợp
bỏ khóa ngoài ràng buộc oracle
khóa duy nhất trong oracle:Khóa duy nhất thực thi duy nhất trong cột trong bảng và giúp chúng tôi xác định hàng một cách nhanh chóng. Oracle tạo chỉ mục duy nhất cho khóa nếu không có chỉ mục nào có sẵn
xóa truy vấn trong oracle
https://en.wikipedia.org/wiki/Foreign_key


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để tạo thư mục trong Oracle?

  2. Các chức năng phân tích LEAD và LAG

  3. Xử lý múi giờ trong ứng dụng web

  4. Thứ tự hàng mặc định cho truy vấn chọn trong oracle

  5. ojdbc14.jar so với ojdbc6.jar