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