理解外键约束

--自定义账户访问别的用户的表
select * from scott.emp;
select * from scott.dept;

--foreign key 外键约束
--创建班级表
create table t_class(
    cid number(6),
    cname varchar2(12)
)

--方式三:添加班级约束
alter table t_class add constraints pk_class primary key(cid);
alter table t_class modify cname varchar2(12) not null;

--班级表添加数据
insert into t_class values (1,‘java304‘);
insert into t_class values (2,‘java204‘);
insert into t_class values (3,‘android‘);
insert into t_class (cid,cname)values (4,‘android‘);
select * from t_class;
drop table t_class;

--创建学生表
create table t_student(
    sno number(6) primary key,
    sname varchar(12) not null,
    sex varchar2(2) default ‘男‘ check(sex=‘男‘ or sex=‘女‘),
    age number(3) check(age>=10 and age<=30),
    enterdate date,
    classid number(6),
    --方式一:创建外键约束
    --classid number(6) references t_class(cid),  --references 加s
    email varchar2(30) unique  --逗号注意!
    --方式二:创建表时 单独 创建外键约束
    --constraints fk_student_classid foreign key(classid) references t_class(cid)
)
--方式三:创建表后 通过修改表的方式创建外键约束
alter table t_student add constraints fk_student_classid foreign key(classid) references t_class(cid);

alter table t_student add constraints fk_student_classid foreign key(classid) references t_class(cid) on delete set null;
alter table t_student add constraints fk_student_classid foreign key(classid) references t_class(cid) on delete cascade;

alter table t_student drop constraints fk_student_classid;
--添加表数据
insert into t_student values(1,‘yan‘,‘男‘,‘20‘,‘29-3月-2017‘,‘1‘,‘[email protected]‘);
insert into t_student values(2,‘yan‘,‘男‘,‘20‘,‘29-3月-2017‘,‘22‘,‘[email protected]‘);
insert into t_student values(3,‘yan‘,‘男‘,‘20‘,‘29-3月-2017‘,‘1‘,‘[email protected]‘);

delete t_class  where cid = 1;
select * from t_class;
insert into t_class (cid,cname)values(1,‘java304‘);

select * from t_student;
drop table t_student;
--缺点:
--1.学生的编号不能是不存在的班级
--解决方案:外键约束
--2.删除指定的班级(cid)时,关联表中(t_student)指定的学生及其班级编号(classid)仍然存在
--解决方案:
--1.默认的 不删除学生 就不能删除班级
--2.可以删除班级 同时将学生的classid置为空  应用场合:如学生--班级
--3.可以删除班级 同时级联删除对应班级的学生  应用场合:如文章--评论
时间: 2024-07-28 18:08:52

理解外键约束的相关文章

牛腩新闻发布系统---外键约束下如何删除记录

一.为什么使用外键? 查了些资料,八个字"保持完整性.一致性",结合我之前做的重构机房收费系统,我的理解是"防止相关表中数据没有关联而变得孤立,最终导致数据冗余",得出这个结论是上次让贾丽敏帮忙点系统时候我最深刻的感受,因为我的数据库关系图中辣么多张表却没有丝毫关系-- 既然官方解释是"完整性和一致性",就先来说明一下: 对于完整性和一致性,不少人都混为一谈了. 完整性(integrity)更多是针对实际业务来说的,比如说一个职员ID,不能在一个

MySQL外键约束

如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表. 外键是用来保证数据的完整性和一致性,通过外键的检查而使不正确的删除,插入操作失败. 不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松. 触发器同样也能完成修改或者删除操作的级联操作,2者的区别如下(自己的理解): 1.触发器会更耗资源,对原表的操作和对从表的级联操作是在一个事务中的. 2.表的数据量不大,结构不复杂时优先考虑外键约束. 3.触发器比外键约

主键和外键约束(主表与从表)

通过上一篇随笔,笔者了解到,实体完整性是通过主键约束实现的,而参照完整性是通过外键约束实现的,两者都是为了保证数据的完整性和一致性. 主键约束比较好理解,就是主键值不能为空且不重复,已经强调好多次,所以这里重点记录对外键约束的学习. 主表与从表 若同一个数据库中,B表的外键与A表的主键相对应,则A表为主表,B表为从表. 假设学生表(学号,姓名,性别,专业号),专业表(专业号,专业名称),则学生表中的专业号为学生表的外键,其与专业表中"专业号"属性相关联,因此,专业表为主表,学生表为从表

SQL中创建外键约束

alter table 表名 add constraint 外键约束名 foreign key(列名) references 引用外键表(列名)

MySQL的外键约束:Cascade/Restrict/No action/SET NULL

转自:http://blog.csdn.net/cnjsnt_s/article/details/5548280 具体使用时需要参考:http://blog.csdn.net/codeforme/article/details/5539454 (注:没看很明白,囧.) MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束.InnoDB中外键约束定义的语法如下: [CONSTRAINT [symbol]] FOREIGN KEY [index_nam

mysql的外键约束

创建表格: #首先登录mysql mysql -uroot 打开一个数据库 mysql>use db1; 创建一个父表,我们命名为province, mysql> create table province ( -> id smallint auto_increment key, -> name varchar(10) NOT NULL -> ); 创建一个子表,命名为student,其中其pid引用来自province的id, mysql> create table

外键约束 以及 数据库中实体的对应关系(1==1,1==n,n==n)

1.1.1 外键约束 Create database day16; Use day16; 创建部门表: create table dept( did int primary key auto_increment, dname varchar(20) ); insert into dept values (null,'研发部'); insert into dept values (null,'教研部'); insert into dept values (null,'市场部'); 创建员工表: c

sql完美删除外键约束,避免产生问题

解决无法删除表,提示被外键约束引用 有时想删除某个表时,提示“无法删除对象 'Orders',因为该对象正由一个 FOREIGN KEY 约束引用”,原因很简单不要急躁,它被其它表的外键引用了,所以无法删除,在此只需先找到哪些表的外键引用了该表的字段.通过系统函数就能解决(SQL Server系统函数提供了非常完善的功能,能代替我们查找和解决许多问题). select     fk.name,fk.object_id,OBJECT_NAME(fk.parent_object_id) as ref

sql查询指定表外键约束

//////////////////查询指定表外键约束select a.name as 约束名, object_name(b.parent_object_id) as 外键表, d.name as 外键列, object_name(b.referenced_object_id) as 主健表, c.name as 主键列 from sys.foreign_keys A inner join sys.foreign_key_columns B on A.object_id=b.constraint