目录

一、约束介绍

二、非空约束

三、主键约束

(1)添加主键约束

(2)删除主键约束

(3)创建表之后为表添加主键约束

(4)主键自动增长

(4)联合主键

四、外键约束

(1)外键约束的创建

(2)外键约束在实际中的运用


一、约束介绍

MySQL约束:在创建数据表的时候,指定的对数据表的列的数据限制性的要求(对表的列(字段)中的数据进行限制)

表中的列(字段)添加约束有以下意义:

(1)保证数据的有效性(2)保证数据的完整性(3)保证数据的正确性

字段常⻅的约束:

⾮空约束(not null):限制此列的值必须提供,不能为null(空值)
唯⼀约束(unique):在表中的多条数据,此列的值不能重复
主键约束(primary key):⾮空+唯⼀,能够唯⼀标识数据表中的⼀条数据
外键约束(foreign key):建⽴不同表之间的关联关系

二、非空约束

非空约束:被定义列(字段)的数据不能为空值,在适用DML语言进行数据插入时被定义列(字段)未指定值时,系统报错。
以创建图书表为例:设置图书表的 book_name not null

##最后定义字段后不用加逗号
create table books(
book_isbn char(4),
book_name varchar(10) not null,
book_author varchar(6)
);

对表添加数据,表内制定了非空约束的字段(列:book_name),我们通过客户端NAVICAT进行字段添加的时候会出现book_name字段添加错误。

三、主键约束

主键约束:数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性 。

主键作用:用于其他表的外键关联,以及本记录的修改与删除。主键是能确定一条记录的唯一标识,主键字段必须唯一,必须非空,一个表中只能有一个主键,主键可以包含一个或多个字段。打个比方,一条记录包括身份正号,姓名,年龄,学校,国籍,性别等。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。

主键字段的特性:被定义字段不能为空值(null);字段数据不能重复。

(1)添加主键约束

以创建图书表为例:设置图书表的 book_isbn primary key(主键)

create table books(
book_isbn char(4) primary key,
book_name varchar(10) not null,
book_author varchar(6)
);##另一种写法:将主键字段定义写在最后单独成语句create table books(
book_isbn char(4),
book_name varchar(10) not null,
book_author varchar(6),
primary key(book_isbn)
);

在Navicat中通过desc语句进行对创建表的查询

(2)删除主键约束

删除books表中的主键约束:

alter table books drop primary key;

在Navicat中用desc语句进行对创建表的查询

(3)创建表之后为表添加主键约束

## 创建表时没有添加主键约束
create table books(
book_isbn char(4),
book_name varchar(10) not null,
book_author varchar(6)
);## 创建表之后添加主键约束
alter table books modify book_isbn char(4) primary key;

运行代码块后在进行表格式的查询后发现表和直接添加主键的结果一样。

(4)主键自动增长

在我们创建⼀张数据表时,如果数据表中有列可以作为主键(例如:学⽣表的学号、图
书表的isbn)我们可以直接这是这个列为主键;
当有些数据表中没有合适的列作为主键时,我们可以额外定义⼀个与记录本身⽆关的列
(ID)作为主键,此列数据⽆具体的含义主要⽤于标识⼀条记录,在mysql中我们可以
将此列定义为int,同时设置为 ⾃动增⻓ ,当我们向数据表中新增⼀条记录时,⽆需提供
ID列的值,它会⾃动⽣成。

列如:对给定字段(id)设置成自动生成。

create table types(
id int primary key auto_increment,
name varchar(20) not null,
remark varchar(100)
);

添加主键自动增长后查询数据表的格式如下:

我们通过DML语言(数据操纵语言)对数据库插入数据

insert into types (name,remark) VALUES ('张三','非常好'),('王五','一级棒');

查看数据表文件,我们发小,我们在添加数据时并没有添加id字段的数据,但是表中自动生成了表的数据

注意:⾃动增⻓从1开始,每添加⼀条记录,⾃动的增⻓的列会⾃定+1,当我们把某条记录删
除之后再添加数据,⾃动增⻓的数据也不会重复⽣成(⾃动增⻓只保证唯⼀性、不保证连续
性)

(4)联合主键

联合主键:在约束条件中除去单独主键之外,还有联合主键,将数据表中的多列组合在⼀起设置为表的主键。但是在实际企业项⽬的数据库设计中,联合主键使⽤频率并不⾼;当⼀个张数据表中没有明确的字段可以作为主键时,我们可以额外添加⼀个ID字段作为主键。

定义联合主键:

定义语句如下:

create table grades(
stu_num char(8),
course_id int,
score int,
primary key(stu_num,course_id)
);

创建以后我们还是通过desc对表进行查看

四、外键约束

外键约束:将⼀个列添加外键约束与另⼀张表的主键(唯⼀列)进⾏关联之后,这个外键
约束的列添加的数据必须要在关联的主键字段中存在。通俗的讲就是在主键表中的主键字段与另外一张外键表的外键字段有关联。(注:一张表可以主键和外键同时存在)

(1)外键约束的创建

在此我们通过学生表与班级表创建主外键约束进行案例演示:

先创建班级表

create table classes(
class_id int primary key auto_increment,
class_name varchar(40) not null unique,
class_remark varchar(200)
);

再创建学⽣表(在学⽣表中添加外键与班级表的主键进⾏关联)

##方法一:在创建表的时候,定义cid字段,并添加外键约束
# 由于cid 列 要与classes表的class_id进⾏关联,因此cid字段类型和⻓度要与
class_id⼀致create table students(
stu_num char(8) primary key,
stu_name varchar(20) not null,
stu_gender char(2) not null,
stu_age int not null,
cid int,
constraint FK_STUDENTS_CLASSES foreign key(cid) references classes(class_id)
);##方法二:先创建表,再添加外键约束
create table students(
stu_num char(8) primary key,
stu_name varchar(20) not null,
stu_gender char(2) not null,
stu_age int not null,
cid int
);# 在创建表之后,为cid添加外键约束
alter table students add constraint FK_STUDENTS_CLASSES foreign
key(cid) references classes(class_id);

创建过后我们可以通过查看表格格式信息,查看创建的主外键信息

学生表

班级表

至此我们在学生表里观测到字段cid对班级表中的class_id进行了关联,但我们在此会想一个问题,这个外键创建了后有什么作用?下面我们会讲解外键约束的实际运用

(2)外键约束在实际中的运用

主表:对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表。

从表:对于两个具有关联关系的表而言,相关联字段中外键所在的表就是从表

定义一个外键时,需要遵守下列规则:

  • 父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
  • 必须为父表定义主键。
  • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
  • 在父表的表名后面指定列名或列名的组合。这个列或列的组合必须是父表的主键或候选键。
  • 外键中列的数目必须和父表的主键中列的数目相同。
  • 外键中列的数据类型必须和父表主键中对应列的数据类型相同

我们对上述学生表和班级表添加数据

##向班级表添加信息
insert into classes(class_name,class_remark)
values('Java2104','...'),('Java2105','...'),('Java2106','...'),('Python2106','...');##向学生表添加信息
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210102','李斯','⼥',20, 4 );
# 添加学⽣时,设置给cid外键列的值必须在其关联的主表classes的classs_id列存在
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210103','王五','男',20, 6 );

我们先对班级表进行信息添加,添加的信息如下:

此时我们需要知道的是学生信息表(students)的cid外键的值与关联主表classes的class_id的值相互关联,因此在上述照片中class_id是1、2、3、4,因此我们在添加数据的时候进行了cid=6的值的添加,此时就会报错。

因此对于外键约束,当我们在表中设计了外键约束,此时设置的外键的值必须与外键关联表的字段的值一致。 这就是外键约束的运用,外键约束保证了表与表之间的完整性,准确性,避免了多关系性数据表的数据的不一致。

补充!!!

删除外键约束操作语句:

alter table students drop foreign key FK_STUDENTS_CLASSES;

MySQL数据库之字段约束相关推荐

  1. oracle字段加约束,Oracle数据库的字段约束创建和维护示例

    创建Oracle数据库的字段约束: 非空约束 唯一约束 对字段的取值的约束 默认值 外键约束 create table tab_class( class_id number primary key, ...

  2. mysql增加布尔字段_JDBC对MySQL数据库布尔字段的操作方法

    本文实例讲述了JDBC对MySQL数据库布尔字段的操作方法.分享给大家供大家参考.具体分析如下: 在Mysql数据库如果要使用布尔字段,而应该设置为BIT(1)类型 此类型在Mysql中不能通过MyS ...

  3. Django创建mysql数据库常用字段及参数

    原文衔接:https://www.cnblogs.com/yanjiayi098-001/p/11733938.html Django创建mysql数据库常用字段及参数 常用字段 1.models.A ...

  4. mysql数据库约束详解_基于MySQL数据库的数据约束实例及五种完整性约束介绍

    为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确.有效.相容. ...

  5. MySQL数据库中有字段类型是日期,时间的插入语句处理

    MySQL数据库中有字段类型是日期,时间的插入语句处理 什么是时间戳? TIMESTAMP是一种类型,具体的值:19990717080000 CURRENT_TIMESTAMP是什么意思? on up ...

  6. Mysql数据库的字段类型:

    数据库的数据类型和字段属性: 1.数值 ①tinyint     十分小的数据          1个字节 ②smallint    较小的数据            2个字节 ③mediumint ...

  7. MySQL数据库中的约束和default

    约束与default 约束 primary key(主键特点是不可以为空,不可以重复) unique(可以为空,不可以重复,但空值可以重复) not null auto_increment defau ...

  8. MySQL | 数据库的六种约束、表的关系、三大范式

    文章目录 数据库约束 NOT NULL(非空约束) UNIQUE(唯一约束) DEFAULT(缺省约束) PRIMARY KEY(主键约束) AUTO_INCREMENT 自增 FOREIGN KEY ...

  9. 在Python里通过Pandas和pymysql库批量修改MySQL数据库的字段名称和字段类型

    在Python做一个关键词排名处理程序的时候,使用Pandas将处理好的数据以pd.to_sql的方法写入MYSQL数据库,带有日期的字段名自动加了时分秒这样的"00:00:00" ...

  10. linux下查看mysql数据库的字段类型_系统运维|[小白技巧]如何在Linux上检查MySQL数据表的存储引擎类型...

    提问: 我想要知道我的MySQL数据库是MyISAM还是Innodb类型.我该如何检查MySQL数据库表的类型? MySQl主要使用两种存储引擎:MyISAM 和 Innodb.MyISAM是非事务的 ...

最新文章

  1. Anaconda 环境下 R 包 ggraph_1.0.2 安装小记
  2. 80页笔记看遍机器学习基本概念、算法、模型,帮新手少走弯路
  3. 遍历JavaScript中的数组
  4. Android(java)学习笔记158:多线程断点下载的原理(JavaSE实现)
  5. linux下启动和关闭网卡命令
  6. 关联挖掘算法Apriori和FP-Tree学习
  7. JS的常用正则表达式 验证密码
  8. python socket传输图片_python使用socket传输图片视频等文件的实现方式
  9. Python | 7招教你识别一个网站是否是Django后台
  10. [论文阅读] Automatic Polyp Segmentation via Multi-scale Subtraction Network
  11. windows系统bat批处理 windows 关机,重启,锁定,休眠,注销
  12. [BZOJ4303]数列
  13. 认知电子战 (1.2):认知理论及其在无线电领域的应用
  14. leapftp 3.0.1使用教程,leapftp 3.0.1使用教程图解
  15. 计算机办公软件的课件,计算机常用办公软件ppt课件
  16. 如何解决C盘实际空闲空间远大于可压缩卷空间
  17. SAP MM框架协议,合同
  18. 高德智慧交通地图空间可视化SDK设计与实现
  19. RDBMS(关系型数据库)与HBase的对比
  20. 美国科技博客网:改变世界15种技术

热门文章

  1. HFSS - 侧馈矩形微带天线设计与仿真
  2. 【简历模板】网站推荐
  3. html打印文字不显示图片,word打印预览时候没问题但是打印出来时候有些文字却不显示...
  4. Qt之QThread介绍(常用接口及实现、自动释放内存、关闭窗口时停止线程运行、同步互斥)
  5. php的opendir,phpopendir函数与opendir语法
  6. Qt+OpenCV配置教程(图解亲测)
  7. 密码学的安全性浅析2
  8. python判断用户名密码是否正确_Python账号密码登陆判断(三次机会)
  9. 配置阿里云maven仓库地址
  10. Halcon 入门教程(01)