• MySQL——数据的删除以及MySQL中的约束


    删除数据

    删除表中的一行数据,也必须加上 WHERE条件,否则整列的数据都会被删除。删除语句:

    delete from 表名 where 条件;

    他会将所有的符合条件的数据删除,如果不写条件,则表中的数据全部删除:

    如果不添加where:

    首先我们的工具会提醒我们这个语句非常的危险,这是工具自带的功能,如果你使用的是黑窗口则不会有这种提示,我们无视风险,继续执行:

    那么表中的数据就全部都被删除了。

    我们再找一个有数据的表:

    那么我们使用另一个语句也可以删除数据:

    命令格式是这样的:

    truncate table 表名;

    演示一下:

    truncate与delete的区别在之后详细的介绍的时候会说到,现在只需要记住这个语句也可以做到删除数据的效果就可以了。

    约束是什么

    约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。本节实验将在实践操作中熟悉 MySQL中的几种约束。

    SQL中最常用的 SELECT语句,用来在表中选取数据,本节实验中将通过一系列的动手操作详细学习SELECT语句的用法。

    . SQL约束

    . SELECT基本语法

    ·数学符号条件

    ·AND OR IN

    ·通配符

    ·排序

    . SQL内置函数和计算

    ·子查询与连接查询

    SQL约束分类

    听名字就知道,约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。

    比如,规定一个用户的用户名不能为空值且没有重复的记录,这就是一种约束规则。

    在MySQL中,通常有这几种约束:

    约束类型

    主键

    默认值

    唯一

    外键

    非空

    关键字

    PRIMARY KEY

    DEFAULT

    UNIQUE

    FOREIGN KEY

    NOT NULL

    建立含有约束的表

    在之前我们介绍创建表的格式的时候,添加约束的地方是在字段类型的后面,我们直接添加对应的约束即可:

    create table if not exists book( id int primary key , name varchar(20) unique , age varchar(3) not null , address varchar(20) default '背景' );

    我们创建了一个表,这个表中的每一列都带有一个约束,从上到下分别是主键约束,唯一约束,非空约束,默认约束,我们接下来会分别介绍这集中约束的作用。

    主键

    在数据库中,如果有两行记录数据完全一样,那么如何来区分呢?答案是无法区分,如果有两行记录完全相同,那么对于MySQL就会认定它们是同一个实体,这于现实生活是存在差别的。

    假如我们要存储一个学生的信息,信息包含姓名,身高,性别,年龄。

    不幸的是有两个女孩都叫小梦,且她们的身高和年龄相同,数据库将无法区分这两个实体,这时就需要用到主键了。

    主键(PRIMARY KEY)是用于约束表中的一行,作为这一行的唯一标识符,在一张表中通过主键就能准确定位到一行,因此主键十分重要,主键不能有重复记录且不能为空。

    我们向表中插入一行数据:

    我们表中的id这一列已经添加了主键约束,那么按照主键约束的规则,不能重复且不能为空,如果我们再次填写一个id的值和他一样则会出错:

    当我们插入同样的id时,由于id字段有主键约束,则会报错,报错信息是重复的主键的值。

    并且当我们不填充数据的数据也会报错:

    报错信息是不能为空,是因为我们添加了主键约束才会报这个错。

    联合主键

    在有些时候,单一的主键并不能满足于使用,那么就需要使用多个列组成联合主键,联合主键的生命格式如下:

    create table if not exists book1( id int , u_id int, name varchar(20) unique , age varchar(3) not null , address varchar(20) default '北京', primary key (id,u_id) );

    联合主键的定义就不能在字段后面定义,需要在建表语句的最后使用primary key ()关键字定义,括号内的参数就是要组成联合主键的字段名,多个字段名之间用逗号隔开。

    主键自增

    主键的值是固定的,有时候我们在自己添加的时候可能会忘记自己添加到那里了,或者如果中间有空行就会出错,不如直接让主键列自己增长,我们不用手动填入主键的值,就可以在表中自己填入正确的主键值:

    在主键列的主键关键字primary key后面使用另一个关键字auto_increment,就可以在添加主键的时候填入一个null,之后就可以在表中自己填入对应的值:

    可以看到,我们在插入数据的时候填入的是null,但是我们在数据库中显示的数字是按照1,2,3……这样自动增长的,这就是主键自增。

    默认值约束

    默认值约束(DEFAULT)规定,当有DEFAULT约束的列,插入数据为空时,将使用默认值。

    默认值常用于—些可有可无的字段,比如用户的个性签名,如果用户没有设置,系统给他应该设定一个默认的文本,比如空文本或‘这个人太懒了,没有留下任何信息'

    在之前的案例中,第四个字段使用的就是默认值约束:

    当这个字段我们不填充任何的值的时候,那么default后面的值就会被自动填充进去:

    注意,是不填充任何的值,如果你最后写了一个null,那么最后的显示结果是这样的:

    可以看到默认值约束并没有应用上去,这里涉及到一个MySQL的null值和空值的区别,其实这个null也是一种数值,这个在之后我们会深入讨论他的问题。

    这里我们只需要知道,如果要default约束被应用只需要填充的时候使用选择列填充的方式,不填充任何内容在自动约束所在的列中即可。

    唯一约束

    唯—约束(UNIQUE)比较简单,它规定—张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。

    我们之间案例中的第二个字段就添加了非空约束,我们先看一下表中已有的数据:

    当前表中的name的值是添加了唯一约束的,并且此时没有重复的值,那么现在我添加一个重复的值:

    当添加了唯一约束的字段中添加了重复的值,那么就会报错,报错信息是重复的键值,在book2表的name字段上。

    那么如果是两个null值的话,会怎么样呢?

    null并不算做是重复的值,现在理解比较好理解,就是没有值也就没有比较的对象嘛,但是之后我们介绍null的细节的时候,我们再详细的展开null到底代表的是什么。

    外键约束

    外键(FOREIGN KEY)既能确保数据完整性,也能表现表之间的关系。

    比如,现在有用户表和文章表,给文章表中添加一个指向用户id 的外键,表示这篇文章所属的用户id,外键将确保这个外键指向的记录是存在的,如果你尝试删除一个用户,而这个用户还有文章存在于数据库中,那么操作将无法完成并报错。因为你删除了该用户过后,他发布的文章都没有所属用户了,而这样的情况是不被允许的。同理,你在创建一篇文章的时候也不能为它指定一个不存在的用户id。

    一个表可以有多个外键,每个外键必须REFERENCES(参考)另—个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。

    外键约束是什么呢,就是我现在有一个表,我的表中的某一个列添加了外键约束,这个外键约束参考了另一个表中的主键列,那么我在向添加了外键约束的字段中插入值的时候,这个值的取值范围只能是另一个表中主键列已经存在的值,否则会插入失败。类似于ENUM,只能从一个范围中取值,只不过这个范围在另一个表上。

    现在我创建了两张表,一张student,一张stu_cord,现在stu_cord表的c_id添加了外键约束,在插入数据的时候,stu_cord的c_id的值只能插入student表中的id字段已有的值:

    我先给student插入一些数据,然后向stu_cord中插入一些数据:

    现在是一切正常,但是如果我这么操作:

    插入失败了,为什么呢?就是因为当我向c_id列中插入数据的时候,c_id列添加了外键约束,这个列中插入的数值要参考student的id字段的值,只能插入id字段中已有的值,现在student表中的数值是这样的:

    很显然,我要插入的4并不在他的id中,所以我插入失败了,这就是外键约束的一个体现,当你插入的数值不在我参考的列中,那么你的值无法插入。

  • 相关阅读:
    遥感目标检测(1)--R3Det
    高等数学(第七版)同济大学 习题4-4(后14题) 个人解答
    SqlServer 列转行,用逗号,分割
    自己动手写线程池——向JDK线程池进发
    C语言程序设计教程(第三版)李凤霞 第九章课后习题答案
    常用数据库的最大并发和实际并发
    m基于FPGA和MATLAB的数字CIC滤波器设计和实现
    NF-ResNet:去掉BN归一化,值得细读的网络信号分析 | ICLR 2021
    Spring 注解配置实例化 bean 流程源码分析
    2. PCIE TLP解包封包
  • 原文地址:https://blog.csdn.net/hssjsh/article/details/132708267