目录
转:https://blog.csdn.net/weixin_35698659/article/details/116435342
一、案例
1、创建员工表ks,字段如下要求
id:数字型,主键,非空 name:字符型,非空 sex:字符型,只能是"M"或"F" birthday:日期型,默认值为"1995-12-31" personid:字符型,唯一 address:字符型 remark:字符型 向员工表中插入至少3条记录,以适应不同的约束。
2、创建薪资表salary,字段要求如下:
id:数字型,主键,非空 eid:数字型,外键,关联ks表的id salary:数字型,取值范围为:5000.00-50000.00 向薪资表salary中插入至少3条记录,以适应不同的约束。
3、根据以上要求建表ks,并创建各种约束,同时插入数据。
CREATE TABLE ks ( id NUMBER(5), name NVARCHAR2(50) NOT NULL, sex NCHAR(1), birthday DATE DEFAULT(TO_DATE('1995-12-31','YYYY-MM-DD')), personid NVARCHAR2(20), address NVARCHAR2(100), remark NVARCHAR2(100), CONSTRAINT PK_employee_id PRIMARY KEY(id), CONSTRAINT CK_employee_sex CHECK(sex='M' OR sex='F'), CONSTRAINT UQ_employee_personid UNIQUE(personid) );
INSERT INTO ks VALUES(1001,'LLL01','M',TO_DATE('2005-01-15','YYYY-MM-DD'),'10249012343901','no',null); INSERT INTO ks VALUES(1002,'LLL02','M',TO_DATE('2006-01-15','YYYY-MM-DD'),'10249012344902','cy','good'); INSERT INTO ks VALUES(1003,'LLL03','M',TO_DATE('2008-01-15','YYYY-MM-DD'),'10249012354903','sh','best');
5、创建表salary,同时创建外键并插入数据
CREATE TABLE salary ( id NUMBER(5), eid NUMBER(5), salary NUMBER(7,2), CONSTRAINT PK_salary_id PRIMARY KEY(id), CONSTRAINT FK_salary_eid FOREIGN KEY(eid) REFERENCES ks (id), CONSTRAINT CK_salary_salary CHECK(salary BETWEEN 5000.00 AND 50000.00) );
INSERT INTO salary VALUES(1,1001,5000.00); INSERT INTO salary VALUES(2,1002,50000.00); INSERT INTO salary VALUES(3,1003,8000.00);
6、查询 学号为 1001.1002 的学生姓名,工资。
select ks.id ,name,salary from ks,salary where ks.id in(1001,1002) and ks.id=salary.eid
-- 如何不加后面的 ks.id=salary.eid ,查询出来的就会很多,也就是交叉查询结果。
7、删除外键
alter table salary drop constraint FK_salary_eid;
8、新增外键(更改on delete参数值)
alter table salary add constraint FK_salary_eid FOREIGN KEY(eid) REFERENCES ks (id) on delete set null;
二、说明
https://blog.csdn.net/u012289399/article/details/89194523
在Oracle数据库中,外键是用来实现參照完整性的方法之中的一个。打个比喻。外键是指定义外键的表的列的值必须在还有一个表中出现。
被參照的表称之为父表(parent table),创建外键的表称之为子表(child table)。子表中的外键关联了父表中的主键。
外键能够在创建表时定义或者通过ALTER TABLE语句创建。
外键(FK)是用于建立或加强两个表数据之间的链接的一列或多列。
在我们使用主键全局唯一标识符的记录时,我们就可以在我们要找数据的表那里确认我们需要寻找的数据。
例如:
我要在employees表里来确认员工的信息:
我还可以在departments表里来确认部门的信息:
但是我们要如何去确定employees表中的随便一条信息呢,比如id = 200的员工他属于那个部门呢?
因为一个部门可以容纳很多个员工,所以在Oracle关系模型中,这种关系又被称为“一对多”,即一条部门对应多个员工。
为了表达这种一对多的关系,我要在employees表中加入department_id,让他的值和departments表中的其中一条数据联系上。
这样,我们就可以通过department_id这个列确定employees表的某一天数据对应departments表的那一条数据。
在employees表中,通过department_id字段可以把数据与另一张表关联起来,这种列称为外键。
外键并不是通过列名实现的,而是通过定义外键约束实现的:
外键约束的名称可以任意,FOREIGN KEY(department_id)指定了department_id作为外键,REFERENCES DEPARTMENTD(department_id)指定了这个外键将关联到departments表的department_id列(即departments表的主键)。
通过定义外键约束,关系数据库可以保证无法插入无效的数据。即如果departments表不存在department_id=99的记录,employees表就无法插入department_id=99的记录。
因为外键约束会降低数据库的性能,所有呢,大部分互联网公司为了用户体验,通常都不会去并设置外键约束,而是靠自身应用程序逻辑的的正确性来使用。这种情况下,department_id仅仅是一个普通的列,只是它起到了外键的作用而已。
要删除一个外键约束,也是通过ALTER TABLE实现的。
alter table salary DROP constraint FK_deartment_eid;
注意:删除外键约束并没有删除外键这一列。删除列是通过DROP FOREIGN KEY实现的。
三、外键关键字 - OnDelete
原文链接:https://blog.csdn.net/yaoxin521123/article/details/119267757
指定当外部表中删除的记录被当前表中的记录引用时,此外部键应在当前表中引起的操作。
用法
要指定在外部表中删除引用的记录时在当前表中发生的情况,请使用以下语法:
ForeignKey keyname(key_props) References pkg.class(ref_index) [ OnDelete = ondelete ];
其中ondelete是下列之一:
noaction无操作(默认)——————当试图删除外部表中的引用记录时,尝试会失败。 cascade级联——————————————当外部表中的引用记录被删除时,该表中的引用记录也将被删除。 setdefault —————————————当引用记录在外部表中被删除时,引用记录中对外部表的引用被设置为其默认值。 setnull ————————————————当外部表中的被引用记录被删除时,引用记录中对外部表的引用被设置为null。
默认
当删除外部表中的某一行时,将检查外部表上具有外键约束的所有引用表,以查看是否有任何行引用了正在删除的行。如果找到任何这样的引用,OnDelete操作将生效。
默认
默认值为noaction。
setnull案例如下:
四、更详细的外键信息
https://blog.csdn.net/liqing_201104/article/details/16823219