mysql外键约束总结
总结三种MySQL外键约束方式
如果表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 外键约束备注
梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...
- MySQL外键约束On Delete、On Update各取值的含义
主键.外键和索引的区别? 主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...
- MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用
MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束.InnoDB中外键约束定义的语法如下: ALTER TABLE tbl_name ADD [CON ...
- Mysql外键约束设置使用方法
如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常 ...
- mysql 外键约束
外键的定义语法:[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...) REFERENCES tbl_name (index_col ...
- MYSQL外键约束的参照操作
如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常 ...
- 1、Mysql无法创建外键的原因 2、MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用
在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1. 两个字段的类型或者大小不严格匹配.例如,如果一个 ...
- MySQL外键约束_ON DELETE CASCADE/ON UPDATE CASCADE
MySQL通过外键约束实现数据库的参照完整性,外键约束条件可在创建外键时指定,table的存储引擎只能是InnoDB,因为只有这种存储模式才支持外键. 外键约束条件有以下4种: (1)restrict ...
- mysql 外键约束示例
-- 创建测试主表. ID 是主键.CREATE TABLE test_main ( id INT, value VARCHAR(10), PRIMARY KEY(id)); -- ...
随机推荐
- bzoj 3173 最长上升子序列
Written with StackEdit. Description 给定一个序列,初始为空.现在我们将\(1\)到\(N\)的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字, ...
- NETCore中RabbitMQ的使用
NET中RabbitMQ的使用 https://www.cnblogs.com/xibei666/p/5931267.html 概述 MQ全称为Message Queue, 消息队列(MQ)是一种应用 ...
- C# 实现程序只启动一次(总结)
我前面的三篇文章是从网上找到的(如下链接),都说是实现程序只启动一次的功能. C#防止程序多次运行C#检测程序重复运行的函数(可以在多用户登录情况下检测)C# 实现程序只启动一次(多次运行激活第一个实 ...
- jmeter --- 测试计划里的元件
1.线程组 线程组元件是任何一个测试计划的开始点.在一个测试计划中的所有元件都必须在某个线程组下.顾名思义,线程组元件控制JMeter执行你的测试计划时候使用的线程数量.对线程组的控制允许你: 设置线 ...
- pmap命令 查看进程用了多少内存
pmap命令 查看进程用了多少内存 用法 pmap [ -x | -d ] [ -q ] pids ...
- ZPAY个人收款助手使用说明
ZPAY个人收款助手使用说明 功能特点: ZPAY个人收款助手可实现收款成功后发送通知到服务器,网页可从服务器获取到付款状态从而完成操作. 可支持微信,支付宝的个人收款需求,无需支付宝微信认证,无需上 ...
- ONVIF、RTSP/RTP、FFMPEG的开发实录
前言 本文从零基础一步步实现ONVIF协议.RTSP/RTP协议获取IPC实时视频流.FFMPEG解码.开发环境为WIN7 32位 + VS2010. 最终成功获取浩云.海康.大华的IPC实时视频流. ...
- 庖丁解牛-----Live555源码彻底解密(根据MediaServer讲解Rtsp的建立过程)
live555MediaServer.cpp服务端源码讲解 int main(int argc, char** argv) { // Begin by setting up our usage env ...
- git 本地文件里内容 操作记录
本地环境文件合并分支(以下的都分别 commit提交了的) [一.分支[追加] 和 [新增] 新信息 合并主线 情景] 分支内容: dr.find_element_by_id("su&qu ...
- os模块sys模块-sys.argv命令行参数
提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于s ...