mysql约束_不是吧,阿Sir,MySQL约束你竟然还不懂!

e82b58233024a5e026ad93755f005d9c.png

以前写的太乱了,翻出来重新整理下

系列目录:

MySQL入门,问题不大【增删改查极速上手】

(一) 引入约束

(1) 约束出现在哪里?

想要讲解约束,就要知道约束用在哪里,用来干嘛?

SQL 语言通过定义一个关系所对应的基本表来完成关系模式的定义,其语句格式为:

CREATE TABLE 表名(
    1> 1> [],
    [2> 2> [],...],
    []
);

符号规定:下面展示一些定义的时候,为简便理解,使用中文配合符号表述(会有具体举例,不用担心理解不了)

  • >< 中的内容为实际的语义

  • [] 中的内容为任选项(不填写也可)

  • {} 中的内容必须显式的指定

  • | 为选项符

  • [,…n] 表示前面的项可以重复多次

(2) 约束用来干嘛?

约束,就是针对属性值的一些约束条件,只针对某一列,叫做列级约束针对多列属性的约束,叫做表级约束

怎么理解呢?就例如某一列叫做 学号,我们就指定约束,这一行不允许为 NULL ,同时我们还能指定它为主键,这样通过学号就可以查找到一条唯一的学生记录了,还有例如外键知识等等…

总结起来就一句话:约束用来对表中的数据进行限定,保证数据的正确性、有效性和完整性

同样,有了约束知识的铺垫,我们就可以引申出后面的一些知识,例如多表操作等等,所以约束虽然简单,还是非常重要的哈~

(二) 常见约束

(1) 主键约束

A:基本概念

在关系模型中,主键的本质其实就是一个候选键

理解非常简单,就是能通过这个主键,确定一个唯一的记录:例如学号是学生实体的候选键,一个学号就能确定这个学生到底哪个学生,而我们不选择姓名,这是因为,姓名在实际的情况中,不能作为一个唯一的标识,确认一个唯一的学生记录

候选键:关系中能唯一标志一个元组的最小属性集

5e1e64554e90aed1a6bee08e6fac4e1d.png

B:特点

确定为主键的列,不能为空,也不能重复!!!

C:具体操作

指定主键约束,使用的是 PRIMARY KEY 关键字

一般来说,主键约束主要用在创建表时,指定约束的方式有两种:

  • ① 定义在列后

CREATE TABLE students  (
  sid INT(8) PRIMARY KEY,
  sname VARCHAR(5),
  department VARCHAR(32),
  birthday date
)
  • ② 独立定义

CREATE TABLE students  (
  sid INT(8),
  sname VARCHAR(5),
  department VARCHAR(32),
  birthday date,
  PRIMARY KEY (sid) 
)

如果在表已经创建好的前提下,还可以通过下列两种方式进行主键的指定和删除

  • ① 删除主键

ALTER TABLE students DROP PRIMARY KEY;
  • ② 指定主键

ALTER TABLE students ADD PRIMARY KEY(sid);

ALTER TABLE students MODIFY sid INT PRIMARY KEY;

D:主键自增

提到主键,就必须提到主键自增了,这个功能也是非常常用的,当设置主动自增后,例如你使用高级语言,操作数据库,向学生表插入一条记录后,即使不给出主键值,主键值也会自动生成出来,并且会在最大主键值的基础上 + 1,例如 0,1,2 … ,n

最重要的一点,主键必须是整型,才能实现自增喔~

如果主键例如 sid 为 varchar 类型,就会有这样的报错:Incorrect column specifier for column 'sid'

同样,主键自增一般用在创建表的时候,使用 AUTO_INCREMENT,直接跟在列名后即可

CREATE TABLE students  (
  sid INT(8) PRIMARY KEY AUTO_INCREMENT,
  sname VARCHAR(5),
  department VARCHAR(32),
  birthday date
)

如果表已经创建好了,还可以进行是否自增的修改

  • ① 设置主键自增

ALTER TABLE students CHANGE sid sid INT AUTO_INCREMENT;

ALTER TABLE students MODIFY sid INT AUTO_INCREMENT;
  • ② 删除主键自增

ALTER TABLE students CHANGE sid sid INT;

ALTER TABLE students MODIFY sid INT;

说明:上面设置以及删除都给出了 CHANGE 和 MODIFY 两种,有什么区别呢?

其实细心的朋友也可以看出来, CHANGE 后要多一个列名 sid(可以修改) ,所以总结如下:

  • 只修改类型用 MODIFY

  • 既修改列名,也修改类型用 CHANGE

(2) 非空约束

非空约束很好理解,就是指定非空约束列的值不能为空,我们使用 NOT NULL 来实现这个功能

CREATE TABLE students  (
  sid INT(8) PRIMARY KEY AUTO_INCREMENT,
  sname varchar(5) NOT NULL, -- sname 不为空
  department varchar(32),
  birthday date
);

很简单吧,我们已经将 sname 这个字段(列)在创建时添加了非空约束,如果 sname 在插入时为NULL ,则会报错 Column 'sname' cannot be null

如果表已经创建好了怎么办呢?

  • 创建表完后,添加非空约束

ALTER TABLE students MODIFY sname VARCHAR(5) NOT NULL;
  • 删除 sname 的非空约束

ALTER TABLE students MODIFY sname VARCHAR(5);

(3) 唯一约束

唯一约束,就是指定这个字段(列)的值必须是唯一的,这种感觉就类似主键,例如我们下面要求创建表的时候,指定 sname 不能重名

CREATE TABLE students  (
  sid INT(8) PRIMARY KEY AUTO_INCREMENT,
  sname VARCHAR(5) NOT NULL UNIQUE, -- sname唯一
  department VARCHAR(32),
  birthday date
);

如果添加两条重名的记录,就会报错

INSERT INTO students VALUES (NULL,'张三','计算机系','2020-06-16');
INSERT INTO students VALUES (NULL,'张三','工商管理系','2019-06-16');

错误信息:Duplicate entry '张三' for key 'sname'

同样,如果已经创建表后,又该怎么设置或者删除唯一约束呢?

  • 在创建表后,添加唯一约束

ALTER TABLE students MODIFY sname VARCHAR(8) UNIQUE;
  • 删除唯一约束(本质上就是删除索引)

ALTER TABLE students DROP INDEX sname;
-- 这两种方法都是可以的
drop index sname on students;

(4) 外键约束

A:概念理解

外键的理论定义是比较复杂的,我在以前公众号写过的一篇数据库理论文章中有提及过,但是这一篇我们重点讲解 MySQL 的使用,所以,我们把理论都换成例子和通俗的大白话,先来看个问题:

学生实体和课程实体分别用关系“学生”和“课程”来表示,它们之间的联系用关系“选课”来表示

学生(学号,姓名,所在系,生日)课程(课程编号,课程名,授课老师)选课(学号,课程编号,成绩)

问题:判断各关系的候选键、主键、外键

答:

  • 学生中(students) 学号可以确认唯一的学生是候选键,可做主键,姓名需要在不重名的情况下也可以,但是实际情况不能保证没有重名不合适,课程中(course) 课程编号可以确认唯一的课程是候选键,可做主键,而选课中(sc_relation),需要由学号和课程编号共同才能确定唯一的值,所以两者共同构成候选键,并做主键

  • 选课关系中的 学号(sc_relation.sid)课程号(sc_relation.cid) ,分别代表选课关系的外键,他们分别对应 学生关系的学号(students.sid)课程关系的课程号(course.sid)(不一定要同名,但是为了好理解,一般写成同名)

  • 模拟了几张简单的表,给大家直观的理解

  • 说明:第一张为 学生表 students ,第二张为 课程表 course,第三张为 选课表 sc_relation

ad6f32be84f3c04b699aa8b0e4147367.png
ed7511259ab653dd11807d18987de315.png
e20ca257baabe14c336ea6fb8f2bee23.png

看完这个例子,是不是从理解上感觉清晰了很多,那么接下来,我们就实际操作一下:

C:基本格式

CREATE TABLE 表名(
        ....
        CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称)
);

-- 创建表之后,删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

-- 创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

B:具体操作

032f77ff95d8af7009b2c237f91638e0.png

我们下面,就按照这张图的规划来做

  • 创建学生表 students,学号 sid 为主键

CREATE TABLE students (
    sid INT(8) PRIMARY KEY AUTO_INCREMENT,
    sname VARCHAR(5) NOT NULL UNIQUE,
    department VARCHAR(32),
    birthday date
);
  • 创建课程表 course,课程号 cid 为主键

CREATE TABLE course (
    cid INT(8) PRIMARY KEY AUTO_INCREMENT,
    cname VARCHAR(5),
    teacher VARCHAR(32)
);
  • 创建选课关系表,sc_sid、sc_cid 分别为外键,指向学生表中的学号 sid 和 课程表中的课程号 cid

CREATE TABLE sc_relation  (
    sid INT(8),
    cid INT(8),
    cscore VARCHAR(5),
    CONSTRAINT sc_sid FOREIGN KEY (sid) REFERENCES students(sid),
    CONSTRAINT sc_cid FOREIGN KEY (cid) REFERENCES course(cid)
);

随便提供一些数据,方便大家测试

-- 插入学生数据
INSERT INTO students VALUES (1001, '王五', '工商管理系', '2020-06-16');
INSERT INTO students VALUES (1002, '汤姆', '音乐与舞蹈系', '2020-06-16');
INSERT INTO students VALUES (1003, '杰克', '美术系', '2020-06-16');

-- 插入课程数据
INSERT INTO course VALUES (1, '大学英语', '老师1');
INSERT INTO course VALUES (2, '大学物理', '老师2');
INSERT INTO course VALUES (3, '数据库', '老师3');
INSERT INTO course VALUES (4, '操作系统', '老师4');
INSERT INTO course VALUES (5, '高等数学', '老师5');

-- 插入选课数据
INSERT INTO sc_relation VALUES (1001, 2, '88');
INSERT INTO sc_relation VALUES (1001, 3, '92');
INSERT INTO sc_relation VALUES (1001, 4, '78');
INSERT INTO sc_relation VALUES (1001, 5, '83');
INSERT INTO sc_relation VALUES (1002, 1, '77');
INSERT INTO sc_relation VALUES (1002, 2, '90');
INSERT INTO sc_relation VALUES (1002, 5, '89');
INSERT INTO sc_relation VALUES (1003, 1, '86');
INSERT INTO sc_relation VALUES (1003, 6, '88');
INSERT INTO sc_relation VALUES (1003, 6, '82');

有什么用呢?这个时候学生表以及课程表,就同选课表之间形成了关系,可视化软件编辑插入的时候,就会默认的给出一些可插入的选择,这是软件基于你设置的外键关系而自动寻找的

fafaf4bec5e99fe59cf8b0a3b555f498.png

创建表后又怎么操作呢?

  • 创建表之后,删除外键

ALTER TABLE sc_relation DROP FOREIGN KEY sc_sid;
  • 创建表之后,添加外键

ALTER TABLE sc_relation ADD CONSTRAINT sc_sid FOREIGN KEY (sid) REFERENCES students(sid)

C:级联操作

如果在上述选课表中已经存储着 关于学号为 1001 学生的相关选课信息,如果这个时候,在学生表中修改或者删除这条记录,就会直接报错

Cannot add or update a child row: a foreign key constraint fails (`mysql_grammar_test`.`sc_relation`, CONSTRAINT `sc_sid` FOREIGN KEY (`sid`) REFERENCES `students` (`sid`))

所以我们使用级联操作就可以达到同时更新或者删除多张表内的相关数据

先给出基本格式:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE;
  • A:级联更新:ON UPDATE CASCADE

  • B:级联删除:ON DELETE CASCADE

例如测试一下

ALTER TABLE sc_relation ADD CONSTRAINT sc_sid FOREIGN KEY (sid) REFERENCES students(sid) ON UPDATE CASCADE ON DELETE CASCADE;

之前不能操作的内容,现在已经可以了,例如我们在学生表中将 1001学号修改为 1008 ,这样选课表中相关的内容就会自动根据修改变化了哈

49ed066be9d010db2e0f16d42a86ef62.png

结尾

邮箱:ideal_bwh@163.com

如果能帮到你的话,那就来关注我吧!

如果您更喜欢微信文章的阅读方式,可以关注我的公众号

如果您更加喜欢PC端的阅读方式,可以访问我的个人博客

域名:www.ideal-20.cn

在这里的我们素不相识,却都在为了自己的梦而努力 ❤

一个坚持推送原创开发技术文章的公众号:理想二旬不止

638900523538126184750b72cc4be200.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dc持久内存与mysql_Calypso Systems推出测试软件和服务器测试傲腾数据中心级持久内存...

Calypso Systems测试Optane DCPMM(DC Persistent Memory Module 数据中心级持久性内存模块)的性能&#xff0c;带宽超过36500MB/s(顺序读写速度128000MB/s)&#xff0c;每秒读写速度为3240万IOPS(顺序读取速度5000)&#xff0c;平均响应时间达到0.11微秒。Calypso PM(持久性内存…

计算机行业研究及2020年策略:聚焦主赛道,投资真成长(84页)

来源&#xff1a;国元证券1、行业涨幅位居前列&#xff0c;个股表现精彩纷呈……2、IT 产业大变革&#xff0c;新机遇不断涌现近年来&#xff0c;以 5G、物联网、云计算、大数据、人工智能、区块链等技术为代表的信息 科技行业快速发展&#xff0c;新兴技术不断涌现&#xff0c…

最长回文串_第78天——第78题(最长回文串 )

今天又是阴天&#xff0c;不过阴天凉快&#xff0c;我喜欢。第78天——第78题&#xff08;最长回文串&#xff09;看题目&#xff01;给定一个包含大写字母和小写字母的字符串&#xff0c;找到通过这些字母构造成的最长的回文串。在构造过程中&#xff0c;请注意区分大小写。比…

python是后端语言还是前端语言_从前端到后台-语言选择

截止至2019年10月&#xff0c;TIOBE编程语言排行如图所示这里重点考虑前三种语言和JS。C作为底层语言直接忽略&#xff0c;主要对JAVA&#xff0c;Python和JS进行对比。JAVA: 强类型静态语言&#xff0c;入门较Python难度更大&#xff0c;常用于企业级应用。如金融&#xff0c;…

二进制权值计算 lsb_2020年二级计算机基础知识备考(第二章)

点击蓝字关注我们哟~2020年9月全国计算机等级考试倒计时29天&#xff0c;还没有好好备考的小伙伴们抓紧时间备考了~今天&#xff0c;跟着考无忧继续备考一下二级计算机基础知识的《第二章 信息的表示和储存》。2.1数据与信息1.数据&#xff1a;客观事物的符号表示&#xff0c;如…

机器人产业这些领域大有可为

来源&#xff1a;中国机器人网前言&#xff1a;机器人产业面临哪些挑战&#xff0c;未来有哪些趋势&#xff1f;当前&#xff0c;世界正迎来新一轮科技革命。传统制造业转型升级释放出巨大的市场潜力&#xff0c;催生高科技机器人的新需求&#xff0c;成为加速产业发展的新动力…

mysql数据库安全机制研究意义_MySQL数据库的安全机制

收稿日期:2001 - 12 - 30   作者简介:李书振(1965 - ) ,男 ,河南人 ,工程师 ,主要研究方向:数据库原理及应用、管理信息系统. 文章编号 :1001 - 9081(2002)06 - 0051 - 03 MySQL 数据库的安全机制 李书振 (武汉大学 信息管理学院 ,湖北 武汉 430072) 摘  要 :MySQL 是一个多…

国产AI全面崛起!盘点11款2019年热门国产AI芯片

来源&#xff1a;芯师爷人工智能的崛起主要得益于算法、数据和计算能力三方面的突破&#xff0c;这三方面的能力展现离不开AI芯片。由此&#xff0c;AI芯片的研发制造成了人工智能技术发展过程中的关键环节。不同于其它传统芯片&#xff0c;AI芯片是近年新兴产品&#xff0c;拥…

python中set函数作用如何自己用代码实现_Python进阶开发之元类编程

Photo byJoyous From Lofter本文目录类是如何产生的如何使用type创建类理解什么是元类使用元类的意义元类实战&#xff1a;ORM.1. 类是如何产生的类是如何产生&#xff1f;这个问题肯定很傻。实则不然&#xff0c;很多人只知道使用继承的表面形式来创建一个类&#xff0c;却不知…

《构建之法》 读书笔记(4)

敏捷流程 敏捷开发原则.尽早并持续地交付有价值的软件以满足顾客需求。敏捷流程欢迎需求的变化&#xff0c;并利用这种变化来提高用户的竞争优势。.经常发布可用的软件&#xff0c;发布间隔可以从几周到几个月&#xff0c;能短则短。.业务人员和开发人员在项目开发过程中应该每…

【周末阅读】10年内,19个关键技术将改变世界

来源&#xff1a;人民网 中国AI协会【导读】根据世界经济论坛全球议程理事会关于《未来软件与社会》的一份报告&#xff0c;到2025年前&#xff0c;很多新兴技术将会达到其临界点。该理事会调查走访了超过800名来自技术行业的企业高管和专家&#xff0c;并分享了他们关于这些黑…

linux mysql安装_LINUX 安装 MYSQL

安装成功的样子&#xff1a;[[email protected] mysql]# mysql -u root -pEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 18130Server version: 8.0.19 MySQL Community Server - GPLCopyright (c) 2000, 2020, Oracle…

上传文件实时显示网速怎么实现_担心PC程序吃内存占网速?有了它终于放心了...

自乔帮主发布iPhone至今&#xff0c;智能手机已经走过了13个年头&#xff0c;其系统、UI、操作逻辑都已经逐步完善且相当傻瓜化。所以总有许多人切换到PC上时&#xff0c;总感觉缺了那么点东西&#xff0c;Windows系统的生产力自然是毋庸置疑&#xff0c;但其繁琐、复杂且不直观…

Jmeter生成html格式测试报告

使用jmeter进行性能测试&#xff0c;运行完毕后生成html格式的测试报告&#xff0c;需要进行如下操作&#xff1a; 1.在C:\apache-jmeter-3.0\bin文件夹下的user.properties文本中添加如下信息&#xff1a; jmeter.save.saveservice.assertion_results_failure_messagetrue jme…

python字符串怎么用_零基础如何使用python处理字符串?

摘要&#xff1a;Python的普遍使用场景是自动化测试、爬取网页数据、科学分析之类&#xff0c;这其中都涉及到了对数据的处理&#xff0c;而数据的表现形式很多&#xff0c;今天我们来讲讲字符串的操作。字符串是作为任意一门编程语言的基础&#xff0c;在Python中的关键字叫做…

iOS NSString 与NSData转化

1. 字符串转Data NSString * str "str"; NSData *data [str dataUsingEncoding:NSUTF8StringEncoding]; 2.NSData 转NSString NSString * str [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 3.data 转char NSData *data; char * ha…

python eval函数格式_Python函数中eval函数知识点

python 的集合类型和 其他语言类似, 是一个无序不重复元素集,我在之前学过的其他的语言好像没有见过这个类型&#xff0c;基本功能包括关系测试和消除重复元素.集合对象还支持union(联合), intersection(交), difference(差)和sysmmetricdifference(对称差集)等数学运算,和我们…

为什么在python中整数的值没有限制_python-为什么math.log接受大整数值?

我终于钻入python math lib source code,发现了这一点&#xff1a;/* A decent logarithm is easy to compute even for huge ints, but libm cantdo that by itself -- loghelper can. func is log or log10, and name is"log" or "log10". Note that ove…

汽车芯片科普

来源&#xff1a;湖杉资本智能驾驶涉及人机交互、视觉处理、智能决策等&#xff0c;核心是 AI 算法和芯片。伴随汽车电子化提速&#xff0c;汽车半导体加速成长&#xff0c;2017 年全球市场规模 288 亿美元&#xff08;26%&#xff09;&#xff0c;远高于整车销量增速&#xff…

python程序打包时出现lib not found_pyinstaller打包py脚本Warning:lib not found等相关问题...

小爬从使用Pyinstaller打包py为exe文件以来&#xff0c;一直都会碰到Warning&#xff1a;lib not found等相关问题&#xff0c;诸如&#xff1a;虽然大多数时候&#xff0c;您像我一样忽略这些warning&#xff0c;打包后的exe也能运行。网上有一堆的方法&#xff0c;有建议装wi…