今日刷题总结10

外键约束

外键 (FK) 是用于在两个表中的数据之间建立和加强链接的一列或多列的组合,可控制在外键表中存储的数据。 在外键引用中,当包含一个表的主键值的一个或多个列被另一个表中的一个或多个列引用时,就在这两个表之间创建了链接。 这个列就成为第二个表的外键。比如表A中的主键是表B中的字段,则该字段就是表B的外键,表A是主表,表B是从表。以MySQL为例,总结一下3种外键约束方式的区别和联系。

假设有学生表student(sid,sname,did)以及院系表depart(did,dname)。sid为student的主键,did为depart的主键且为student的外键。创建depart表的sql语句如下:

create table depart(

did int not null,

dname varchar(50),

primary key(did)

)

然后插入三条记录(1,“计算机学院”),(2,“经贸学院”)。

insert into depart(1,"计算机学院");

insert into depart(2,"经贸学院");

分别以不同的约束方式创建外键引用关系:

(1)NO ACTION:数据库引擎将引发错误,此时将回滚对主表中行的删除或更新操作。

create table student(

sid int not null,

sname varchar(30),

primary key(sid),

foreign key(did) references depart(did) on delete no action on update no action

)

插入3条记录(1,“张三”,1),(2,“李四”,2),(3,“王五”,3)。

insert into student(1,"张三",1);#插入成功

insert into student(2,"李四",2);#插入成功

insert into student(3,"王五",3);#无法插入,院系号3不存在,与参照完整性约束不符

delete from depart where did=1;#从表student中有相关引用,因此主表中无法删除

update depart set did=2 where did=1;#从表中有相关引用,因此主表中无法修改

(2)CASCADE:如果在主表中更新或删除了一行,则将在从表中更新或删除相应的行。

create table student(

sid int not null,

sname varchar(30),

primary key(sid),

foreign key(did) references depart(did) on delete cascade on update cascade

)

插入3条记录(1,“张三”,1),(2,“李四”,2),(3,“王五”,3)。

insert into student(1,"张三",1);#插入成功

insert into student(2,"李四",2);#插入成功

insert into student(3,"王五",3);#无法插入,院系号3不存在,与参照完整性约束不符

delete from depart where did=2;#student中第2条记录级联删除

update depart set did=2 where did=1;#student中第一条记录的did级联修改为2

(3)SET NULL:如果更新或删除了主表中的相应行,则会将构成外键的所有值设置为 NULL。

create table student(

sid int not null,

sname varchar(30),

primary key(sid),

foreign key(did) references depart(did) on delete set null on update set null

)

插入3条记录(1,“张三”,1),(2,“李四”,2),(3,“王五”,3)。

insert into student(1,"张三",1);#插入成功

insert into student(2,"李四",2);#插入成功

insert into student(3,"王五",3);#无法插入,院系号3不存在,与参照完整性约束不符

delete from depart where did=1;#student中第1条记录的did设置为NULL

update depart set did=1 where did=2;#student中第2条记录的did设置为NULL

时间: 2024-10-01 22:23:36

今日刷题总结10的相关文章

leecode刷题(10)-- 旋转图像

leecode刷题(10)-- 旋转图像 旋转图像 描述: 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 1: 给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ] 示例 2: 给定 matrix = [ [ 5, 1, 9,11], [

今日刷题集合

月考没考,最皮的是刷题效率低的可怕,搜索中的那些回溯用的还是很水,不如总结一下. codevs 题号:1501 1506 1842 1983 2549 2806 3143 3145 1008 1294 1295 1501 二叉树的最大宽度和高度(没加using namespace std ;会过不去编译,max.min函数封装在#include<iostream>里,所以没有using namespace std ;不行.) 1 #include<bits/stdc++.h> 2

今日刷题总结11

FTP工作原理 (1)当FTP客户端发出请求时,系统将 动态分配一个端口(如 x ). (2)若FTP服务器在端口21侦听到该请求,则在 FTP客户端的端口 x 和 FTP服务器的端口21之间建立起一个FTP会话连接. (3)当需要传输数据时, FTP客户端再动态打开一个连接到FTP服务器的端口20的第2个端口(如 x+1 ),这样就可在这两个端口之间进行数据的传输.当数据传输完毕后,这    两个端口会自动关闭. (4)当FTP客户端断开与FTP服务器的连接时,客户端上动态分配的端口将自动释放

今日刷题总结3

稳定排序 (1)冒泡排序:冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.如果两个元素相等,不用进行交换:所以冒泡排序是一种稳定排序算法. (2)归并排序 :归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素或者2个序列(1次比较和交换),然后把各个有序的短序列合并成一个有序的长序列,不断合并直到原序列全部排好序.在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也不进行交换.在短的有序序列合并的过程中可以保证如果两个当

今日刷题总结21

C++的内存分配方式 之前有说过C++的内存分为5部分,即栈.堆.全局/静态存储区.自由存储区以及常量存储区. 栈:栈由编译器自动分配与释放,它用来存储函数的参数值以及局部变量. 堆:堆由应用程序分配与释放,应用程序使用malloc在堆上获取内存,使用free释放内存.如果应用程序获取内存后没有释放,就会造成内存泄漏,在应用程序终止时泄漏的内存才会被操作系统回收. 自由存储区:自由存储区是C++中基于new和delete的抽象概念.当应用程序使用new分配内存时,就说该内存是自由存储区.C++编

今日刷题总结9

数据存取路径 数据存取是指数据库数据存贮组织和存贮路径的实现和维护.在计算机中,数据一般以文件形式保存或存放在数据库中.在数据库,数据存取路径分为主存存取路径与辅存存取路径,前者主要用于主键检索,后者用于辅助键检索.在系统中,路径一般分为相对路径和绝对路径. 数据存取路径是指存取数据的位置,由于程序运行具有局部性,不可能把所有数据都调入内存,在内存中只有一部分数据,其余数据都在外存,因此数据存取路径分为辅存存取路径和内存存取路径,不同的路径,查找的方法是不同的,一般分为内存查找和辅存查找. 内存

今日刷题总结7

内联函数 内联函数是由inline关键字修饰.在类内定义的函数默认为内联函数.从源代码的层面上看,内联函数有函数的结构,而在编译后,却不具备函数的性质.内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处,这类似于宏替换,使用函数体替换调用处的函数名.能否形成内联函数,需要看编译器对该函数定义的具体处理. 内联函数的主要作用是用来消除函数调用时的时间开销.它通常用于频繁执行的函数,对于小内存空间的函数非常受益. 使用内联函数的时候要注意: (1)递归函数不能定义为内联函数 (

今日刷题总结17

拥塞控制方法 (1)慢开始和拥塞避免 发送方维持一个拥塞窗口cwnd的状态变量,开始时cwnd的大小为一个最大报文段长度MSS.发送方发送完窗口内所有报文段后,每收到一个新的对已发送报文段的确认,就把cwnd增加至多一个MSS.以下说明了慢开始与拥塞避免的原理,其中cwnd的大小用MSS的个数来衡量. 最初发送方设置cwnd=1,发送第一个报文段M1,收到对M1的确认后,cwnd从1增大为2,然后发送方接着发送cwnd中的M2和M3两个报文段,接收方接收后对M2和M3确认.发送方每接收到一个对已

今日刷题总结19

共享区域与私有区域 每个进程都有自己的私有虚拟地址空间,避免了受到其他进程的错误读写.但是,通常的c程序几乎都使用到标准库函数,例如printf或者scanf,如果每个进程都要为这些常用库函数在物理内存保留一份拷贝,这样对内存就非常浪费了. 为了解决上述问题,可以将常用库函数设定为共享对象,共享对象在物理内存上只有一份拷贝,多个进程可以把自身虚拟内存的一个区域映射到该共享对象上,这些区域就叫共享区域,如果一个进程在自己的共享区域进行写操作,在其他进程的共享区域内能看到相应的改变,并且这种改变也会