草庐IT

MySQL数据库:6、约束的概述及语法

Kkkkangsh 2023-03-28 原文

Python基础之MySQL数据库

一、约束概述

1、为什么要约束

​ 为了防止数据库中存在不符合语义规定的数据和防止错误信息的输入、输出造成无效的操作而提出的

​ 为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制,从以下四个方面考虑

  • 实体完整性:例如一个表中不能存在两条相同的,无法区分的记录
  • 域完整性:例如年龄范围,性别范围
  • 引用完整性:例如学生所在的班级、学校,在学校中要能找到班级、在班级能找到学生
  • 用户自定义完整性:例如用户名唯一,密码不能不空

2、什么是约束

​ 约束是指,对字段名下数据的强制约束

​ 约束的方式:

  • 创建表时约束:create table
create table 表名(字段名 类型(数字) 约束条件);

3、约束的分类

  • 根据约束数据列的限制,约束可分为
    • 单列约束:每个约束只能约束一列
    • 多列约束:每个约束可约束多列数据
  • 根据约束的作用范围,约束可分为
    • 列级约束:只能作用在一个列上,跟在列的定义后面
    • 表级约束:可以作用在多个列上,单独定义
  • 根据约束的作用,约束可分为
    • 非空约束:规定某个字段不能为空
    • 唯一约束:规定某个字段的数据不能重复
    • 主键约束:非空且唯一,一个表只能拥有一个主键字段
    • 外键约束:主要体现在父子表中关系数据的约束操作
    • 检查约束:控制特定列中的值的完整性约束
    • 默认值约束:在不特别添加数据的情况下,该字段名下数据使用默认数据

4、查看当前表已有的约束

方式一:

​ show create table 表名;

方式二:

​ describe 表名;/desc 表名;

二、约束语法及用法

1、无符号

  • 关键词:unsigned

  • 作用:在SQL中,整型和浮点类型都自带正负号,而很多数据并用不到负数,例如人的年龄,手机号码,这时就可以通过约束条件解除正负号

mysql> create table t2(id tinyint unsigned);
Query OK, 0 rows affected (0.01 sec)

2、零填充

  • 关键词:zerofill

  • 作用:在创建表时,整型和浮点型后一般不用输入数字,系统会默认生成,在添加数据后,系统指挥默认显示该数值的大小及位数,通过零填充加数值,可固定数据值现实位数,不足部分用零填充

mysql> create table t4(id tinyint(2) zerofill);
Query OK, 0 rows affected (0.01 sec)

3、非空

  • 关键词:not null

  • 作用:所有字段类型,在不做非空约束的情况下,插入的数据值都可以为空(null),在创建表阶段可以约束该字段下数据为非空,约束后在往表内添加数据时,该字段下不能为空,空字符除外

mysql> create table t5(id int(3) zerofill, name varchar(16) not null);
Query OK, 0 rows affected (0.02 sec)

4、默认值

  • 关键词:default

  • 作用:在创建表阶段,在类型后约束默认值,可在默认值后方填入默认值,添加该字段下的数据时,不进行特殊定义的话会采用默认值

mysql> create table t(id int primary key auto_increment,
    -> name varchar(32) not null,
    -> gender varchar(8) default 'mela');
Query OK, 0 rows affected (0.02 sec)

5、唯一值

5、1.单列唯一(列级)

  • 关键词:unique

  • 作用:唯一值是指,在创建表阶段,可通过约束唯一值的条件,使在往该表内约束的字段下添加的数据不能重复出现,例如往序号字段下添加‘序号1’后,该序号将不能在重复出现在其他列

mysql> create table t6(id int unique, name varchar(16) not null);
Query OK, 0 rows affected (0.04 sec)

5、2.联合唯一(表级)

  • 关键词:unique(字段名1,字段名2,...)

  • 作用:联合唯一不在单个字段名下定义,而是单独定义,在关键词后方括号内添加需要进行联合唯一的字段名,那么被添加的多个字段名的数据值将不能共同出现,单个字段名下的数据值可以重复

mysql> create table t7(id int, name varchar(16), unique(id, name));
Query OK, 0 rows affected (0.02 sec)

6、主键

  • 关键词:primary key

  • 作用:单从约束层面上而言的话,主键就相当于‘非空且唯一’,InnoDB存储引擎规定了所有的表都必须拥有且只能有一个主键(在创建表的时候,可以不用手动约束,系统会将其他非空且唯一的字段升级为主键,如果都没有约束的话,后台会自动生成一个隐藏的主键),主键可以加快数据的搜索速度(如果没有主键的话,查找数据就需要一行一行的进行),在我们创建表的时候应该主动约束一个字段为主键,用来标识数据的唯一性,通常使用‘id(编号)’字段

mysql> create table t8(id int primary key, name varchar(16));
Query OK, 0 rows affected (0.02 sec)

7、自增

  • 关键词:auto_increment

  • 作用:通常在存储多个数据的时候,我们都会给数据进行编号,方便查找,自增的意思就是帮助我们生成数据的编号,不需要在手动填写,这样的好处就是省时、省力,还不用专门的去记忆当前的序号是多少。

  • 特性:自增不会因数据删除而退回,只会往前,如果自己设置了更大的数,那么自增就会基于这个数往更大的数去自增,,自增的字段只能是主键

  • 格式化表格:

    • truncate 表名; (可以用来个格式化表格并重置自增)
mysql> insert into t9(name, age) values('jason', 18),('kang',19);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

8、外键

8、1.外键的定义

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

​ 外键也是索引的一种,是通过一张表指向另一张表中的主键,来对两张表进行关联

​ 一张表可以有一个外键,也可以存在多个外键,与多张表进行关联

8、2.外键的作用

主要用于表与表之间的数据关联,减少数据冗余,保证数据的一致性,完整性,主要体现在以下两个方面:
  • 阻止执行:
    • 从表插入新行,其外键值不是主表的主键值便阻止插入
    • 从表修改外键值,新表不是主表的主键值便阻止修改
    • 主表删除行,其主键值在从表里存在则阻止删除(想要删除必须删除从表的相关行)
    • 主表修改主键值,旧值在从表里存在则阻止修改(要想修改,必须先删除从表的相关行)
  • 级联执行:
    • 主表删除行,连带删除从表关联行
    • 主表修改值,连带修改从表关联行的值

8、3.外键的建立

主表:

create table 主表名(
        id 类型 主键 ,
        字段名 类型 约束条件)

从表:

create table 从表名(
    id 类型 主键 ,
    字段名 类型(数字) 约束条件,
    绑定外键的字段名  int,
    foreign key(主表名) references 主表名(主表的主键字段名)
)
  • 在创建主表和从表时,主表必须已经存在于数据库中
  • 录入数据的时候一定要先录入主表的数据
  • 修改数据的时候外键字段无法删除和修改

级联创建的方式:

​ 需要在创建表阶段,在从表外键关键词后加入:

  • 级联更新:on update cascade
  • 级联删除:on delete cascade
create table 从表名(
   id 类型 主键 ,
   字段名 类型(数字) 约束条件,
   绑定外键的字段名  int,
   foreign key(主表名) references 主表名(主表的主键字段名)
	on update cascade
	on delete cascade)

8、4.外键的多种关系

1.一对多:

​ 以员工表为例,通常,一个员工只可以对应一个部门,而一个部门可以对应多个员工,这就是一对多的关系

​ 对于一对多的关系,外键字段应该建立在‘多’的一方

create table dep(id int primary key auto_increment,
	dep_name varchar(32)
	);

create table emp(id int primary key auto_increment,
	emp_name varchar(32) not null,
 	dep_id int, foreign key(dep_id) references dep(id)
 	on update cascade
  	on delete cascade
  	);

2.多对多:

​ 以书籍表与作者表为例

  • 先站在书籍表的角度
    问:一本书能否对应多个作者
    答:可以

  • 再站在作者表的角度
    问:一个作者能否对应多本书
    答:可以

  • 结论:两个都可以 关系就是'多对多'
    针对'多对多'不能在表中直接创建 需要新建第三张关系表

create table book(
	id int primary key auto_increment,
 	title varchar(32),
  	price float(5,2)
);

create table author(
	id int primary key auto_increment,
 	name varchar(32),
  	phone bigint
);

create table book2author(
	id int primary key auto_increment,
   author_id int,
 	foreign key(author_id) references author(id)
  	on update cascade
  	on delete cascade,
   book_id int,
  	foreign key(book_id) references book(id)
  	on update cascade
  	on delete cascade
);

3.一对一:

​ 以用户表与用户详情表为例

  • 先站在用户表的角度
    问:一个用户能否对应多个用户详情
    答:不可以
  • 再站在用户详情表的角度
    问:一个用户详情能否对应多个用户
    答:不可以
  • 结论:两个都可以 关系就是'一对一'或者没有关系
    针对'一对一'外键字段建在任何一方都可以 但是推荐建在查询频率较高的表中
create table user(
	id int primary key auto_increment,
  	name varchar(32),
 	detail_id int unique,
  	foreign key(detail_id) references userdetail(id)
  	on update cascade
  	on delete cascade
);

create table userdetail(
	id int primary key auto_increment,
  	phone bigint
);

有关MySQL数据库:6、约束的概述及语法的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  4. ruby - 覆盖相似的方法,更短的语法 - 2

    在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. ruby 语法糖 : dealing with nils - 2

    可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby​​编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some

  7. ruby - Ruby 语法糖有 "rules"吗? - 2

    我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[]method.它被引入a=["foo",1,"bar",2]=>["foo",1,"bar",2]Hash[*a]=>{"foo"=>1,"bar"=>2}稍加思索,我发现Hash[*a]等同于Hash.[](*a)或Hash.[]*一个。我的问题是为什么会这样。是什么让您将*a放在方括号内,是否有某种规则可以在何时何地使用“it”?编辑:我的措辞似乎造成了一些困惑。我不是在问数组扩展。我明白了。我的问题基本上是:如果[]是方法名称,为什么可以将参数放在括号内?这看起来几乎——但不完全是——就像说如果你有一个方法Foo.d

  8. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  9. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  10. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

随机推荐