sql_外键

2023-05-16

一、外键的定义

1. 外键是一种索引,是通过一张表中的一列指向另一张表的主键,使得这两张表产生关联

2. 是某个表中的一列,它包含在另一个表的主键中

3. 一张表中可以有一个外键也可以有多个外键

二、外键的作用

减少单张表的冗余信息

三、使用外键后想要删除/更新主表的相关列会报错,因为从表正在使用。使用外键后若想向从表中插入新列,但是外键值主表中没有,会报错,更新从表的外键值,但是值不在从表中会报错。

 

四、如何创建外键

法1:创建表的时候添加外键

CONSTRAINT 约束名 FOREIGN KEY(字段名) REFERENCES 主表(被引用列)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;
SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;
RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;
NO ACTION:同 RESTRICT,也是首先先检查外键;

其中跟随外键改动是:删除主表中,外键行时,从表相关行也删除。更新主表中外键相关行时,从表的使用行也改变

若,事触发限制为默认值,限制外表中外键的改动,则在添加外键之后对表中数据的增删改查都需要注意

例:

CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
sex VARCHAR(255),
age INT);

CREATE TABLE IF NOT EXISTS student_score(
id INT PRIMARY KEY AUTO_INCREMENT,
class VARCHAR(20),
score INT,
student_id INT,
CONSTRAINT fk_s_id FOREIGN KEY(student_id) REFERENCES student(id))

法2:修改表时添加外键约束

ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段名)
REFERENCES 外表表名(主键字段名)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

 

例如,1.向从表中插入新行,但是外键值不在主表中,会报错

#向从表中插入新行,但是外键值不在主表中,会报错
INSERT INTO student_score(`class`,`student_id`,`score`) VALUES ('语文',2,100)

 2.

#更新从表外键值,新值不在主表中,会报错
UPDATE student_score SET student_id=2
WHERE student_id=1

3.

#主表想要删除行,但是主键值在从表里存在,会报错(必须先删除从表使用行,才能再删主表的相关行)--或者采用级联删除

DELETE FROM student
WHERE id=1;


#级联删除 on delete cascade
 
ALTER TABLE student_score DROP FOREIGN KEY fk_s_id;

ALTER TABLE student_score ADD CONSTRAINT fk_s_id FOREIGN KEY(student_id)
REFERENCES student(id) ON DELETE CASCADE 

4.

#主表修改主键值,但是旧值在从表中使用了,会报错,必须先删除从表的使用行,才能再修改--或者采用级联更新
#级联更新
on update cascadde


UPDATE student SET id = 2 WHERE id = 1;


ALTER TABLE student_score DROP FOREIGN KEY fk_s_id;

ALTER TABLE student_score ADD CONSTRAINT fk_s_id FOREIGN KEY(student_id)
REFERENCES student(id) ON update CASCADE  

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sql_外键 的相关文章

  • 按小时拆分日期/时间数据并将日期/时间范围展开为行

    我正在尝试使用 SQL Server 将一系列日期 时间数据扩展为多行 例如 我的数据看起来像 Date StartTime EndTime EmployeeID ShiftType 10 1 2019 8 30 00AM 4 57 00P
  • 在 plsql 中立即执行

    如何从这段代码中得到结果 EXECUTE IMMEDIATE SELECT FROM table name through for loop 通常的方法看起来像这样 for items in select from this table l
  • Postgresql 中的 id 列位置重要吗?

    我正在测试删除主键列 id 的迁移 我想使用外键作为主键 当我运行并恢复迁移时 我看到表的状态是相同的 只是 id 列现在是最后一个 它会以任何方式改变我的数据库的行为吗 我是否应该费心去恢复迁移恢复代码中的列顺序 理论上一切都应该没问题
  • 显示过去 7 天 PHP 的结果

    我想做的是显示过去 30 天的文章 但我现有的代码不断给我一个 mysql fetch assoc 错误 然后追溯到我的查询 这是代码 sql mysql query SELECT FROM table WHERE DATE datetim
  • MySQL 子查询返回多行

    我正在执行这个查询 SELECT voterfile county Name voterfile precienct PREC ID voterfile precienct Name COUNT SELECT voterfile voter
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • 具有 LINQ 支持的最完整的 ORM?

    我正在寻找一个提供完整或接近完整的 LINQ 支持的 ORM LINQ 到 SQL 支持 LINQ 内部的所有内容 Contains Math Log 等 在不创建新数据上下文的情况下无法预先加载关系属性 ADO NET 实体框架 糟糕的
  • 如何检测 Postgres 中持有锁的查询?

    我想不断跟踪 postgres 中的互锁 我碰到锁具监控 https wiki postgresql org wiki Lock Monitoring文章并尝试运行以下查询 SELECT bl pid AS blocked pid a us
  • 从存储过程中的动态 SQL 获取结果

    我正在编写一个存储过程 需要在过程中动态构造 SQL 语句以引用传入的表名称 我需要让这个 SQL 语句返回一个结果 然后我可以在整个过程的其余部分中使用该结果 我尝试过使用临时表和所有内容 但我不断收到一条消息 提示我需要声明变量等 例如
  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7
  • PreparedStatement setnull方法中Types.INTEGER和Types.NULL的区别

    下面的说法有什么区别 PreparedStatement setNull 1 java sql Types NULL and PreparedStatement setNull 1 java sql Types INTEGER 第一个指示驱
  • 在 Postgres 中的数组字段上应用聚合函数?

    是否可以对整数 字段 或其他数字数组 中的所有值应用聚合 如 avg stddev CREATE TABLE widget measurement integer insert into widget measurement values
  • 更新plpgsql中触发器函数中的多列

    给出以下架构 create table account type a id SERIAL UNIQUE PRIMARY KEY some column VARCHAR create table account type b id SERIA
  • 将多行合并为一行并根据行数附加列

    我正在尝试将同一个表的多行合并为一个 我有一个像这样的示例表 Col1 Col2 Col3 Col4 Col5 Col6 1 BH1 CB 12 CC CC Conveyor Mal 1 BH1 CB 104 ZC ZC Full Emp
  • 使用包含空值列的 WHERE 子句的更新语句

    我正在使用另一个表中的数据更新一个表上的列 这WHERE子句基于多个列 并且某些列为空 根据我的想法 这个空值是什么throwing off你的标准UPDATE TABLE SET X Y WHERE A B陈述 See 这个 SQL 小提
  • 这是过滤数据并防止 SQL 注入和其他攻击的安全方法吗?

    我创建了两个简单的函数来在插入数据进入 mysql 查询之前对其进行过滤 对于表单字段 我还使用正则表达式来单独检查每个字段 Form filter function filter var HTML is not allowed var s
  • ORA-01749: 您不能向自己授予/撤销权限

    我正在运行以下查询RATOR MONITORING授予引用权限的架构RATOR MONITORING CONFIGURATION SMSC GATEWAY表到RATOR MONITORING schema GRANT REFERENCES
  • 当我输入 dateadd 或 datediff 代码时,我总是收到此错误“ORA-00904“DATEADD”无效标识符。”

    我有一个大学项目 并且有一个包含入院和出院日期属性的患者表 我需要删除超过 7 年的记录 我使用了以下代码 delete from patient where dis date gt datedadd yy 7 getdate 我收到错误
  • 多级排序

    我有一个表 其中包含一些记录 其中包含名称 评级等字段 我首先想要根据评级将结果限制为 20 进行排序 然后在此结果集上想要进一步应用基于名称的排序 我知道要排序我们需要使用像这样的查询 Select from table order by
  • SQLite 条件 ORDER BY 中的 DESC

    我需要选择按以下逻辑排序的记录 但是当 DESC 处于条件中时 SQLite 会引发错误 ORDER BY CASE WHEN parentGUID IS NULL THEN datePosted DESC ELSE datePosted

随机推荐

  • Maven项目管理工具学习笔记

    Maven项目管理工具学习笔记 由于本人在最近的项目中使用到了Maven xff0c 但是之前对Maven并没有深入地了解 xff0c 所以借此机会 xff0c 在网上查阅资料 xff0c 对Maven进行进一步的了解 xff0c 并做记录
  • PyQt4控件失去焦点和获得焦点

    QListView控件多选设置 self ui listView setSelectionMode QAbstractItemView ExtendedSelection 初始化QListView控件焦点事件 self ui listVie
  • 远程工具MobaXterm安装和使用教程

    远程登录工具MobaXterm安装和使用教程 1 MobaXterm简介 2 MobaXterm安装 3 MobaXterm使用 创建SSH session 创建串口 session 右键粘贴 4 MobaXterm安全 1 MobaXte
  • GEC6818开发板使用和配置

    GEC6818开发板使用和配置 GEC1808开发板简介极致低功耗强大 AI 运算能力面向 AIoT 应用的丰富接口易于开发主控芯片特性参数 常用接口说明电源接口调试串口CSI摄像头接口以太网接口音频输入接口LCD接口 开发板功能 常用接口
  • Linux最常用命令50条【呕心沥血呐,望用之取之】

    Linux常用命令大全 第一章 Linux基础命令 1 linux ls 2 linux alias 3 linux cd 4 linux clear 5 linux date 6 linux dpkg 7 linux echo 8 lin
  • STM32 GPIO LED和蜂鸣器实现【第四天】

    STM32 GPIO LED实现 原理图一 STM32大小说明二 STM32时钟分析三 GPIO分析1 注意点 四 寄存器地址查找1 写出GPIOF外设的所有寄存器地址 五 LED灯开发1 理解led灯原理图2 打开GPIOF组时钟4 通过
  • Linux安装qt完整版教程

    Linux安装qt完整版教程 一 获取Linux qt版本二 linux安装qt三 配置qt环境变量四 linux qt相关的显示配置 一 获取Linux qt版本 qt 版本5 12 8官网下载地址 选择国内的下载渠道 xff0c 更快
  • STM32嵌入式工程师自我修养

    STM32嵌入式工程师自我修养 一 STM32必备技能二 程序员必须熟知三 学习STM32自备资料和硬件 一 STM32必备技能 1 熟悉 C 语言编程 xff0c 熟练 STM32CUBEMX Keil 开发环境 2 熟悉基于STM32
  • Qt 按钮组(Buttons)输入组(Input Widgets) 显示控件组(Display Widgets) 间隔组(Spacers) 布局组(Layouts) 容器组Containers等

    文章目录 按钮组 xff08 Buttons xff09 输入部件组 xff08 Input Widgets xff09 显示控件组 xff08 Display Widgets xff09 空间间隔组 xff08 Spacers xff09
  • Qt 对话框(QFileDialog)、标准颜色对话框(QColorDialog)、标准字体对话框(QFontDialog)、标准输入对话框(QInputDialog)、QMessageDialog

    文章目录 标准文件对话框 QFileDialog 代码简介QFileDialog类常用静态函数 标准颜色对话框 QColorDialog 代码简介QColorDialog类常用静态函数 标准字体对话框 QFontDialog 代码简介QFo
  • qt 使用textBrowser显示文字和图片,文字居中,图片居中,已测可用

    QTextBrowser显示图文操作 直接上源码UI设计效果截图源码方法2 推荐 源码 直接上源码 这里只给出框架 xff0c 美化的事交给有缘人 UI设计 效果截图 源码 span class token macro property s
  • HTTP报文格式详解

    文章目录 HTTP报文格式请求报文请求行请求头部空行请求数据 响应报文状态行响应头部空行响应体 HTTP报文格式 HTTP报文是面向文本的 xff0c 报文中的每一个字段都是一些ASCII码串 xff0c 每个字段的长度是不确定的 HTTP
  • 从源码分析HashMap集合之属性(一)

    注 xff1a 笔者所使用的jdk为1 8 xff0c 因本人水平有限 xff0c 难免会有错误 xff0c 请批评指正 xff0c 弥补不足 xff0c 多谢 xff0c 另转载请注明出处 我们首先来看下一下HashMap类 public
  • Linux下实现苹果AirPlay音频服务器

    一 背景 背景 xff1a 在华清学习之余 xff0c 自行研究了智能家居的东西 xff0c 为了解决智能家居中背景音乐问题研究如下 xff1a 调查发现现有技术中有DLNA AirPlay Miracast三种 文章后有些项并未验证 xf
  • uCOS-III基础入门函数

    uCOS III是一个主要是运行在单片机上操作系统 xff0c 可以实现并发 xff0c 主要的功能就是任务 mutex event的创建和使用 调度器 调度器就是使用相关算法来决定当前需要执行的任务 xff0c 调度器的核心有两个 xff
  • Java接口实现

    接口是什么 xff0c 它的作用是什么 xff1f 首先 xff0c Java只能实现单继承 xff0c 而有时候实际需要要求我们实现多继承 xff0c 因此 xff0c 接口就是为了实现多继承而开发出来的 xff0c 并且接口支持程序在运
  • python爬取京东商品信息及评论

    准备 chrome浏览器 和 chromeDriver插件 xff08 其他浏览器步骤类似 xff09 python 环境python selenium模块 代码 span class token triple quoted string
  • Error while loading error while loading shared libraries 解决办法

    Error while loading error while loading shared libraries 解决办法 缺失了 xff0c 那就找到放回去 发行版 xff1a Archlinux 如标题所言 xff0c 这里以截至写文章
  • sql-创建复合主键

    一 说明 xff1a 1 数据库的每张表只能有一个主键 xff0c 不可能有多个主键 2 所谓的一张表多个主键 xff0c 我们称之为复合主键 xff08 联合主键 xff09 注 xff1a 联合主键 xff1a 就是用多个字段一起作为一
  • sql_外键

    一 外键的定义 1 外键是一种索引 xff0c 是通过一张表中的一列指向另一张表的主键 xff0c 使得这两张表产生关联 2 是某个表中的一列 xff0c 它包含在另一个表的主键中 3 一张表中可以有一个外键也可以有多个外键 二 外键的作用