外键约束
外键约束:
外键约束就是一张表中的某个字段的数据来源依赖于另外一张表中的某个字段的数据
--删除数据表
DROP TABLE sc PURGE; --选课表,删除的顺序有讲究
DROP TABLE course PURGE; --课程表
DROP TABLE teacher PURGE; --老师数据表
DROP TABLE student PURGE; --学生数据表
--创建数据表
CREATE TABLE student(
sno VARCHAR2(10),
sname VARCHAR2(20),
sage NUMBER(2),
ssex VARCHAR(5),
CONSTRAINT pk_sno PRIMARY KEY(sno) --主键字段
);
CREATE TABLE teacher(
tno VARCHAR2(10),
tname VARCHAR2(20),
CONSTRAINT pk_tno PRIMARY KEY(tno)
);
CREATE TABLE course(
cno VARCHAR2(10),
cname VARCHAR2(20),
tno VARCHAR2(10),
CONSTRAINT pk_cno PRIMARY KEY(cno)
);
--最后创建课程表
CREATE TABLE sc(
sno VARCHAR2(10),
cno VARCHAR2(10),
score NUMBER(4,2)
);
--初始化学生表的数据
INSERT INTO student VALUES('s001','张三',23,'男');
INSERT INTO student VALUES('s002','李四',23,'男');
INSERT INTO student VALUES('s003','王五',23,'男');
INSERT INTO student VALUES('s004','赵六',23,'男');
commit;
--初始化教师表
INSERT INTO teacher VALUES('t001','斯巴达');
INSERT INTO teacher VALUES('t002','尼古拉斯');
INSERT INTO teacher VALUES('t003','雅典娜');
commit;
初始化课程表
INSERT INTO course VALUES('c001','java web','t002');
INSERT INTO course VALUES('c002','oracle','t002');
INSERT INTO course VALUES('c003','c#','t003');
INSERT INTO course VALUES('c004','javascript','t001');
commit;
插入选课信息
INSERT INTO sc VALUES('s001','c001',78);
INSERT INTO sc VALUES('s002','c002',80);
INSERT INTO sc VALUES('s003','c001',98);
INSERT INTO sc VALUES('s004','c003',67);
INSERT INTO sc VALUES('s001','c004',67);
INSERT INTO sc VALUES('s003','c003',67);
INSERT INTO sc VALUES('s002','c001',67);
commit;
观察问题:
INSERT INTO sc(sno,cno,score) VALUES('s100','c1000',90);
此时数据插入成功,但是s100的学生在student表中没有纪律,c1000在course表中没有纪律,所以这样的数据不合理,为了避免这样的问题存在,我们可以在创建数据表的时候使用外键约束来解决这一问题
创建外键约束:
--删除数据表
DROP TABLE sc PURGE;
--创建数据表
CREATE TABLE sc(
sno VARCHAR2(10),
cno VARCHAR2(10),
score NUMBER(4,2)
);
创建sno的外键约束
CONSTRAINT fk_sno FROEIGN KEY(sno) REFERENCES student(sno),
创建cno的外键约束
CONSTRAINT fk_cno FROEIGN KEY(cno) REFERENCES course(cno)
插入选课信息
INSERT INTO sc VALUES('s001','c001',78);
INSERT INTO sc VALUES('s002','c002',80);
INSERT INTO sc VALUES('s003','c001',98);
使用了外键约束保证了不和逻辑的数据不能插入数据表中
总结:
1.外键约束指的是数据表中的,某个字段的数据来源依赖于其他数据表中的某个字段的数据,也就是说当前的数据表中插入的数据必须在其他数据表中有记录
2.使用了外键约束之后,表之间就存在一定的依赖关系,依赖的数据表(引用其他表中数据的表)叫做字表或从表,被依赖的数据表叫做父表或者主表