mysql概要(十四)(二)索引(补充:外键级联操作)
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
如果没有指定 ON DELETE 或 ON UPDATE,则默认为 NO ACTION。
此语句表示:
主表的主键发生删除或者更新(ON DELETE 或 ON UPDATE), 对于(cascade)对应从表外键对应的行会删除或外键值更新 对于(set null)对应从表外键值变更为null 对于(no action)有些特殊,如果在从表外键有对应的值,那么主表不能进行主键的更新和删除
这里以MySQL为例,总结一下3种外键约束方式的区别和联系。
这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
首先创建用户组表:
create table t_group (
id int not null,
name varchar(),
primary key (id)
);
并插入两条记录:
insert into t_group values (, 'Group1');
insert into t_group values (, 'Group2');
下面创建用户表,分别以不同的约束方式创建外键引用关系:
1、级联(cascade)方式
create table t_user (
id int not null,
name varchar(),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete cascade on update cascade
);
参照完整性测试
insert into t_user values (, 'qianxin', ); #可以插入
insert into t_user values (, 'yiyu', ); #可以插入
insert into t_user values (, 'dai', ); #错误,无法插入,用户组3不存在,与参照完整性约束不符
约束方式测试
insert into t_user values (, 'qianxin', );
insert into t_user values (, 'yiyu', );
insert into t_user values (, 'dai', );
delete from t_group where id=; #导致t_user中的2、3记录级联删除
update t_group set id= where id=; #导致t_user中的1记录的groupid级联修改为2
2、置空(set null)方式
create table t_user (
id int not null,
name varchar(),
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 (, 'qianxin', ); #可以插入
insert into t_user values (, 'yiyu', ); #可以插入
insert into t_user values (, 'dai', ); #错误,无法插入,用户组3不存在,与参照完整性约束不符
约束方式测试
insert into t_user values (, 'qianxin', );
insert into t_user values (, 'yiyu', );
insert into t_user values (, 'dai', );
delete from t_group where id=; #导致t_user中的2、3记录的groupid被设置为NULL
update t_group set id= where id=; #导致t_user中的1记录的groupid被设置为NULL
3、禁止(no action / restrict)方式
create table t_user (
id int not null,
name varchar(),
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 (, 'qianxin', ); #可以插入
insert into t_user values (, 'yiyu', ); #可以插入
insert into t_user values (, 'dai', ); #错误,无法插入,用户组3不存在,与参照完整性约束不符
约束方式测试
insert into t_user values (, 'qianxin', );
insert into t_user values (, 'yiyu', );
insert into t_user values (, 'dai', );
delete from t_group where id=; #错误,从表中有相关引用,因此主表中无法删除
update t_group set id= where id=; #错误,从表中有相关引用,因此主表中无法修改
注:在MySQL中,restrict方式与no action方式作用相同。
来源:http://www.samool.com/archives/41586/
mysql概要(十四)(二)索引(补充:外键级联操作)的更多相关文章
- mysql概要(十四)索引(补充:外键级联操作)
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ][ ON UPDATE { NO ACTION | CASCADE | SE ...
- Is it bad to rely on foreign key cascading? 外键 级联操作
Is it bad to rely on foreign key cascading? I'll preface前言 this by saying that I rarely delete rows ...
- MySQL基础(四)——索引
MySQL基础(四)--索引
- MySQL创建数据表并建立主外键关系
为mysql数据表建立主外键需要注意以下几点: 需要建立主外键关系的两个表的存储引擎必须是InnoDB. 外键列和参照列必须具有相似的数据类型,即可以隐式转换的数据类型. 外键列和参照列必须创建索引, ...
- 类型:Oracle;问题:oracle 查询表详细信息;结果:oracle查询表信息(索引,外键,列等)
oracle查询表信息(索引,外键,列等) oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助: 1.查询出所有的用户表sel ...
- 003--PowerDesigner创建索引与外键
PowerDesigner创建索引与外键 一.创建索引 双击Table->Columns->创建索引 Step1:双击Table Step2:选择Columns->创建索引 弹出如下 ...
- Python-多表关联 外键 级联
分表为什么分表 多表关联多表关系 ****** 表之间的关系 为什么要分表 多对一 一个外键 多对多 一个中间表 两个外键 一对一 一个外键加一个唯一约束外键约束 ****** foreign key ...
- 使用admin的步骤、必知必会13条、单表的双下划线、外键的操作、多对多的操作:
MVC M: model 模型 与数据库交互 V: view 视图 HTML C:controller 控制器 流程 和 业务逻辑 MTV M:model ORM T:template 模板 HTML ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
随机推荐
- UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数
lienhua342014-09-16 1 文件的时间 每个文件都有三个时间字段,如表 1 所示. 表 1: 文件的三个时间字段 说明 字段 st_atime 文件数据的最后访问时间 st_mtime ...
- Java编程思想学习笔记——初始化与清理(二)
成员初始化 Java尽力保证:所有变量在使用前都能得到适当的初始化. 方法的局部变量:未初始化,编译错误. void f(){ int i; // System.out.println(i);//编译 ...
- TV和BTV(全变分和双边全变分)
TV:Total Variation BTV:Bilateral Total Variation Osher等在1992 年提出了总变分(TV)超分辨率重建方法,该方法能够有效地去除噪声和消除模糊,但 ...
- Redis集群版在Java中的应用
1.配置redis集群 <?xml version="1.0" encoding="UTF-8"?> <redisCluster> &l ...
- jsavascript 面向对象的下拉菜单
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- ios开发之--调试方法
概述 基本操作 全局断点 条件断点 开启僵尸对象 LLDB命令 概述 在开发项目的工程中,肯定会遇到各种各样的bug,且大多数的bug都和自己有关:那么在和bug斗智斗勇的过程中,如果能快速准确的一击 ...
- Linux进程作业的查看和杀死
引入进程 进程 线程 PS命令.TOP命令.其他查看进程命令 进程的优先级 作业控制机制 kill命令 一.引入进程 1.内存划分为:用户空间和内核空间 1.在用户空间里运行的进程,就是用户进程,所属 ...
- 【内网渗透笔记】Windows2008 R2搭建域控制器
0x00 前言 将网络中的多台计算机逻辑上组织到一起,进行集中管理,这种区别于工作组的逻辑环境叫做域(domain).域是日常计算机管理的一种很有效手段,因此,域控制器自然而然就在成域环境中最重要的角 ...
- mysql 外键约束示例
-- 创建测试主表. ID 是主键.CREATE TABLE test_main ( id INT, value VARCHAR(10), PRIMARY KEY(id)); -- ...
- 使用 requests 访问 HTTPS
当我们访问 HTTPS 的网站时,需要进行证书验证,在浏览器中可以自动处理验证问题,在 Python 中有以下两种做法: import requests //不进行证书验证,但这种方式会出现警告,如下 ...