MySQL表的增删改查

  • 在进行表操作之前,一定要use选中数据库

  • 注释:在SQL中可以使用 --空格+描述 来表示注释说明

  • CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母。

数据库约束

数据库约束可以理解成数据库提供的一种针对 数据合法性 验证的机制

约束类型

  • NOT NULL - 指示某列不能存储 NULL 值,表里的内容是必填项
  • UNIQUE - 保证某列的每行必须是唯一的值(不能重复),每次插入/修改都会先触发查询,如果值已经存在,就会插入/修改失败
  • DEFAULT - 指定没有被赋值的列的默认值。不进行任何指定,默认值就是NULL
  • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。(相当于一条记录的身份标识)
  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
  • CHECK - 保证列中的值符合指定的条件。MySQL数据库对CHECK子句进行分析,但是忽略CHECK子句。也就是不会报错,但是也不会生效。check指定条件,插入/修改数据时数据符合条件才能插入/修改成功;不符合条件则失败

NOT NULL约束

指定某列不为空:

在这里插入图片描述

UNIQUE:唯一约束

指定列的内容唯一的、不重复的:
在这里插入图片描述
在这里插入图片描述

DEFAULT:默认值约束

指定不插入数据时的默认值:

在这里插入图片描述

PRIMARY KEY:主键约束

  • 不能为null
  • 不能重复

相当于NOT NULL 和 UNIQUE 的结合

指定id列为主键:
在这里插入图片描述
一般给表设定主键使用数字(整数形式),很少使用字符串.

  • 一个表只能有一个主键
    在这里插入图片描述

  • 一个主键不一定只针对一个列(联合主键----把多个列的内容联合到一起,共同构成一个主键),很少使用这个功能

  • 当某个列集合了 not nullunique 就成为主键了
    在这里插入图片描述

一般使用整数 id 作为主键,但id的值该如何选择呢?
MySQL提供了"自增主键", 对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,赋值为最大值+1。
在这里插入图片描述

  • auto:自动
  • increment:增加

此时插入数据,主键的值就不用手动指定了

在这里插入图片描述
当然还可以手动指定,不一定依赖自增主键

在这里插入图片描述
如果把 id = 100 和 id = 101 删去,按理来说是从102开始自增,但不知道为啥我的会跳号
在这里插入图片描述
4~102这一批id,如果不手动指定就浪费了,如果不想浪费可以不依赖自动增键主动添加
在这里插入图片描述

自增主键本质 是MySQL服务器存储了当前表中最大的id,再进一步进行累加的。基于分布式系统存储数据的时候,MySQL自增主键就无能为力了.

在分布式系统中,如何生成唯一id?
最简单最朴素的方式: 时间戳 + 机器编号 + 随机数
再计算哈希值得到一个整数,这个整数可以作为id

简单介绍用md5计算hash值的特性

  • 定长. 无论输入的字符串多长,最终计算的hash值都是一样长的(作为校验和的一种方式)
  • 分散. 输入的字符串,哪怕只有一点点不一样,得到的 hash值 都会差异很大(成为hash 算法的根本)
  • 不可逆. 计算出的hash值理论上无法还原成原来的字符串(可以作为一种加密手段)

FOREIGN KEY:外键约束

外键用于关联其他表的主键或唯一键,语法:

foreign key (字段名) references 主表()

案例:
插入 student 表的classId 必须要在 class 表的classId中存在,插入的学生才有意义(从属于某个班级)
在这里插入图片描述
此时,外键就让student 的 classId 就和 class 表的 classId 建立了联系.也就是student classId 中的值,必须要在 class 表的 classId 中存在. class 表就对 student 表产生了制约

  • 父表中被引用的列必须是主键或是 unique
  • 把 class 表(制约别人的表) 称为"父表"(parent table)
  • 把 student 表(被制约的表) 称为"子表"(child table)

父表可以删除/修改没有被子表引用的记录,但如果被引用了就不能删除/修改了.
子表不能随意插入/修改(外键必须在父表中)

CHECK约束(了解)

MySQL使用时不报错,但忽略该约束:

drop table if exists test_user;
create table test_user (
   id int,
   name varchar(20),
   sex varchar(1),
   check (sex ='男' or sex='女')
);

新增(Create)

全列插入

insert into 表名 values (,...);
  • 可以省略into
  • values是关键字

一次插入多行记录

insert into 表名 values(,...), (,...), (,...)...;

一次插入多条记录往往比一次插入一条记录,分多次插入的效率要高

MySQL是客户端 - 服务器结构的程序
客户端中执行的每个操作,都会通过网络请求发送给服务器,而服务器返回一个响应内容
虽然请求中包含了更多的数据,但网络开销更小了.网络开销对效率的影响大

指定列插入

insert into 表名(列名, 列名...) values(,...);

列名个数和顺序无需和表头信息一致,只需保证列名是存在的

插入时间

在这里插入图片描述
'2024-04-22 11:13:00'是一个标准的时间格式化写法
有时,插入的数据要指定当前系统的时间,MySQL有一个专门的函数now()来获取
在这里插入图片描述

插入查询结果(不用values关键字)

需要确保查询到的结果集合(列数/类型/顺序),要和待插入表的列数/类型/顺序匹配

语法:

INSERT INTO 表名 [列名,列名...] SELECT .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值