当前位置: 首页 > news >正文

5.2 参照完整性

5.2.1 外键约束

语法格式:constraint < symbol > foreign key ( col_nam1[, col_nam2... ] ) references table_name (col_nam1[, col_nam2...]) 
[ on delete { restrict | cascade | set null | no action } ] 
[ on update { restrict | cascade | set null | no action } ] 

说明: 
(1)symbol:指定外键约束的名。 
(2)foreign key(col_naml,col_nam2…]):外键关键字,其后面为要设置的外键列名。 
(3)table_name (col_naml[,col_nam2…J):被参照表名,后面为要设置的主键列名。 
(4)on delete | on update:可以为每个外键定义参照动作,包含以下两部分。
①指定参照动作应用的语句,即update和delete语句。 
②指定采取的动作,即restrict,cascade,set null,no action,set default,restrict为默认值。 
(5)restrict:限制策略,要删除或更新被参照表中被参照列上且在外键中出现的值时,拒绝对被参照表的删除或更新操作。 
(6)cascade:级联策略,从被参照表删除或更新行时自动删除或更新参照表中匹配的行。
(7)set null:置空策略,从被参照表删除或更新行时,设置参照表中与之对应的外键列为nu。如果外键列没有指定not null限定词,这就是合法的。 
(8)no action:拒绝动作策略,拒绝采取动作,即如果有一个相关的外键值在被参照表里,删除或更新被参照表中主键值的企图不被允许,和 RESTRICT一样。 
(9) set default: 默认值策略,作用和set null一样,只不过set default是指定参照表中的外键列为默认值。 

1.在创建表时创建外键约束

【例5.10】创建 scorel表,在cno列以列级完整性约束方式定义外键。 

create table 选课1(学号 char (6) not null,课程号 char(4) not null references 课程1 (cno),成绩 tinyint null,primary key(学号,课程号));

 

【例5.11】创建选课2表,在课程号列以表级完整性约束方式定义外键,定义相应参照动作。

create table 选课2(学号 char(6) not null,课程号 char(4) not null,成绩 tinyint null,primary key(学号,课程号),constraint FK_选课2 foreign key(课程号) references 课程2(课程号)on delete cascade on update restrict); 

 

在表级定义外键约束时指定约束名字为FK_选课2。
这里定义了两个参照动作:on delete cascade表示当删除课程表中某个课程号的记录时,如果成绩表中有该课程号的成绩记录,则级联删除该成绩记录;on update restrict表示当课程表某个课程号有成绩记录时,不允许修改该课程号

注意:外键只能引用主键或唯一性约束。

2.删除外键约束

语法格式: 
ALTER TABLE<表名> DROP FOREIGN KEY<外键约束名>; 

【例5.12】删除例8.11在选课2表上定义的外键约束。 

alter table 选课2 drop foreign key FK_选课2;

3.在修改表时创建外键约束

 【例5.13】重新在score2表上定义外键约束。 

alter table 选课2add constraint FK_选课2 foreign key (课程号) references 课程2(课程号);

相关文章:

  • C#操作MySQL从入门到精通(22)——创建表与操纵表
  • 如何手动实现multiSetIfAbsent、multiExpire
  • AI图书推荐:《如何利用ChatGPT在线赚钱》
  • 时序分解 | Matlab实现SCSSA-VMD融合正余弦和柯西变异的麻雀搜索算法优化变分模态分解时间序列信号分解
  • Ps:自动批量处理照片
  • 网络学了点socket,写个聊天室,还得改进
  • 使用proteus仿真51单片机的流水灯实现
  • Codesys中根据时间生成随机数字
  • Java后端开发常见的框架以及组件
  • 欢乐钓鱼大师攻略:buff大全讲解,云手机托管使用教程!
  • 本地知识库问答系统搭建(基于langchain+LLM)
  • ISO 19115-3:2023 关于元数据最小实例的允许命名空间的详细说明
  • IDEA创建Mybatis项目
  • 【MySQL】(基础篇五) —— 排序检索数据
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • CentOS 7 防火墙操作
  • ES6--对象的扩展
  • Hibernate最全面试题
  • JavaScript新鲜事·第5期
  • Tornado学习笔记(1)
  • 多线程 start 和 run 方法到底有什么区别?
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 原生js练习题---第五课
  • 交换综合实验一
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (十)Flink Table API 和 SQL 基本概念
  • (算法)N皇后问题
  • .NET Core 2.1路线图
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net FrameWork简介,数组,枚举
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • /dev下添加设备节点的方法步骤(通过device_create)
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡
  • @Autowired @Resource @Qualifier的区别
  • @staticmethod和@classmethod的作用与区别
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [Django 0-1] Core.Handlers 模块
  • [HTML API]HTMLCollection
  • [k8s源码]6.reflector
  • [Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用
  • [leetcode]216_组合总和III_给定数字范围且输出无重复
  • [luoguP2401] 不等数列
  • [Machine Learning] 领域适应和迁移学习
  • [NOI2005]聪聪与可可(期望)
  • [Python学习日记-12] 双色球彩票程序练习(使用到列表、判断、循环等)
  • [QJS xmake] 非常简单地在Windows下编译QuickJS!
  • [Verilog]用Verilog实现串并转换/并串装换