`
龙塘湾
  • 浏览: 135416 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

外键约束方式

阅读更多
外键约束方式   

如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式的区别和联系。


  这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
    
首先创建用户组表:
创建用户组表
create table t_group (
id int not null,
name varchar(30),
primary key (id)
);
并插入两条记录:
插入记录
insert into t_group values (1, 'Group1');
insert into t_group values (2, 'Group2');


下面创建用户表,分别以不同的约束方式创建外键引用关系:
1、级联(cascade)方式
级联方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete cascade on update cascade
);


参照完整性测试
insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2);    #可以插入
insert into t_user values (3, 'dai', 3); 
  #错误,无法插入,用户组3不存在,与参照完整性约束不符


约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2;         
#导致t_user中的2、3记录级联删除
update t_group set id=2 where id=1;   
   
#导致t_user中的1记录的groupid级联修改为2


2、置空(set null)方式
置空方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete set null on update set null
);


参照完整性测试insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); 
  #可以插入
insert into t_user values (3, 'dai', 3);   
#错误,无法插入,用户组3不存在,与参照完整性约束不符


约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2;                
#导致t_user中的2、3记录的groupid被设置为NULL
update t_group set id=2 where id=1;        
#导致t_user中的1记录的groupid被设置为NULL


3、禁止(no action / restrict)方式
禁止方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete no action on update no action
);


参照完整性测试
insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2);    #可以插入
insert into t_user values (3, 'dai', 3);    
#错误,无法插入,用户组3不存在,与参照完整性约束不符


约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2;            
#错误,从表中有相关引用,因此主表中无法删除
update t_group set id=2 where id=1;        
#错误,从表中有相关引用,因此主表中无法修改


注:在MySQL中,restrict方式与no action方式作用相同。
分享到:
评论

相关推荐

    数据库外键约束方式

    本文档是数据库的外键约束方式指南 需要的朋友请下载 保证可用

    总结三种MySQL外键约束方式

     外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。  这里以MySQL为例,总结一下3种外键约束方式的区别和联系。  ...

    SQL2005入门到精通(12)

    259 12.3.2 使用表设计器定义主键约束 260 12.3.3 使用T-SQL定义主键约束 261 12.4 外键约束 262 12.4.1 一个外键约束的示例 262 12.4.2 使用表设计器定义外键约束 263 12.4.3 使用T-SQL定义外键...

    学生成绩管理系统

    完整性约束包括:主键约束、外键约束、非空约束、规则、默认值、触发器等。 数据表的操纵语句:包括数据插入、数据删除、数据修改操作语句。 7种查询方式,分别涉及到:集合查询、字符匹配查询、汇总查询、分组查询...

    解析在MySQL里创建外键时ERROR 1005的解决办法

    在MySQL里创建外键时,提示错误,但只提示很简单的信息:ERROR 1005 (HY000): Can’t create table ‘db_qxztc.qx_userssssnew’ (errno: 150)。根本起不到解决问题的作用。 要看错误的详细提示,可以使用命令:(在...

    用户角色菜单权限表结构创建以及数据插入

    用户菜单权限表建表语句以及数据插入语句,后台管理系统搭建必备,学习专用。 如果使用外键关联,在对表进行数据操作时就考虑另一张关联的表...so,在设计表时尽量减少表与表直接的外键约束,避免麻烦,表关联关系清晰

    javaweb-day20每日作业卷答案1

    训练案例4训练描述实现表字段的主键约束,自动增长,非空约束,唯一性约束,外键约束.操作步骤答案1:创建表的时候,添加主键方式一:创建表时,在字段描述处,声明指定

    数据库MySQL-(2)

    数据库中的表是用于组织和存储数据的基本结构。它将数据按照特定的列进行分类和整理,使得...5. 数据完整性:表的设计可以定义数据的约束和规则,例如主键约束、外键约束等。这些约束有助于确保数据的完整性和一致性。

    计算机毕业设计:基于 ssm mysql-高校在线请假与审批系统(数据库+程序+论文),保证可靠运行,附赠计算机毕业论文

    同时,我们还考虑了数据的安全性和完整性,通过加密存储敏感信息、设置外键约束等方式,防止数据泄露和非法修改。 在程序开发方面,我们采用SSM框架,实现了用户登录、请假申请、审批流程、通知提醒等功能。通过...

    ETL_面试资料

    独立的数据库表一般指建立的表和其他表没有外键约束关系。这样的表多用于数据处理。 5) 三范式或者关系型模型。 6) 非关系型数据源。非关系型数据源一般包括COBOL copy books、VSAM文件、Flat文件、Spreadsheets等。...

    详解mysql基本操作详细(二)

    mysql中常用的约束:主键约束(primary key) 唯一约束(unique) 非空约束(not null) 外键约束(foreign key) 主键约束:被修饰过的字段唯一非空 注意:一张表只能有一个主键,这个主键可以包含多个字段 方式1:建表的同时...

    SQL脚本生成器

    3.3、增量脚本指在执行主脚本或副脚本之后,根据需求对某个表添加/修改约束(主外键约束,长度约束等),添加/修改字段/添加数据等情况对数据库结构改变处理的一种行为脚本。 1.2作用 1、 快速产出自定义规则...

    手机店铺进销存

    提交方式AJAX,post(系统不建议删除,可能有外键约束,建议使用审核) ·品牌排序: 对应“品牌表”中的sort字段,在以后的使用中是倒序。提交方式AJAX,post(大数在前面) ·品牌审核: 对应“品牌表”中的...

    mysql数据库的基本操作语法

    上面的创建外键的方法没有指定约束名称,系统会默认给外键约束分配外键约束名称,命名为student_ibfk_n, 其中student是表名,n是当前约束从1开始的整数。 指定约束名称: create table student( id int auto_...

    一文搞定MySQL基本命令(更新中)

    数据完整性 ——4种约束5 复合约束6 外键约束7 级联删除/更新8 表查询9 连接方式10.函数11.小练习12.索引、视图13.索引14.储存过程15.流程控制16.触发器、事件17.事件18 事务19 安全管理20 数据库维护 1 数据库创建...

    fixture_dependencies:SequelActiveRecord夹具加载器,用于处理依赖关系图

    以不违反外键约束的方式加载灯具的依赖关系图 有一个非常简单的API(FixtureDependencies.load(:model__fixture)) 处理几乎所有循环依赖 包括用于Test :: Unit的Rails和Sequel测试助手(以及用于RSpec的Sequel...

    SYBASE数据库浏览器

    进行主/从表同步修改,彻底摆脱外键约束! 6 ★可自定义主/从表关联。对于物理上没有主/外键关联的表,可在配置文件中进行设置,使其以主/从窗口 方式显示; 7 ★对表中显示的数据进行查找及替换; 8 ★...

    级联删除笔记【自用0分】

    利用sql server自带的级联删除、级联更新功能,即其外键约束途径 alter table dbo.C add constraint FK_C_A_AID foreign key(AID) references dbo.A(AID) on delete cascade on update cascade go alter table dbo.C...

    MySQL入门到精通

    掌握各种数据库约束:主键/非空/**/默认值/外键约束/零填充/自增长等 掌握表与表的关系:一对一/一对多/多对多 掌握表关系的建表原则 掌握多表查询的方式:内连接/外连接/全连接/子查询等 掌握数据库的三大范式 掌握...

Global site tag (gtag.js) - Google Analytics