1 数据库修改
update 表名 set 列名 =值 where 条件;
- update 表名 set 列=值,列=值...where 条件; 修改多个列
2 数据库删除
delete from 表名 where 条件 /order by/limit;
- delete from 表名 ; -删除整个表的记录,表还在!
- drop table 表名; -删除了表,也删除了记录!
!!!!!!!
delete 和 update 持久生效的,都会影响到数据库服务器硬盘中的数据!!
3 数据库的备份
1.数据库最终都是存储在硬盘上,以文件形式体现(二进制文件),可以直接把文件拷贝放到其他机器上(全量备份)
2.mysqldump 工具(mysql自带程序),会把mysql中的数据导出成一系列insert语句,把这些语句放在另一个mysql运行(全量&增量备份)
3.mysql 有一个binlog 功能(把mysql各种操作,通过日志记录下来),借助binlog(让另一个数据库按照binlog内容执行,也能得到一样数据)(增量备份/实时备份)
4 数据库的约束
约束-数据库自动对数据合法性进行校验检查的一系列机制
【数据名 数据类型 约束】
- NOT NULL 指示某列不为空
- UNIQUE 保证某列的每行有唯一值
unique 会让后续插入/修改数据时,先触发查询操作,来确定是否存在,有约束 ,执行效率会降低;
- DEFAULT 规定没有赋值时的默认值
查看表的结构信息: desc 表名;describe - 描述
排序:order by 列名 desc;descend - 降序
包含的数据:
字段名(
Field
)数据类型(
Type
)是否允许 NULL 值(
Null
)键类型(
Key
,如PRI
表示主键)默认值(
Default
)额外信息(
Extra
,如auto_increment
)DEFAULT 可以修改默认值;
- PRIMARY KEY 主键,NOTNULL和UNIQUE的结合,确保某列(或多个列结合)有唯一标识
一张表只有一个PRIMARY KEY (身份标识)
主键约束的表 每次插入/修改数据,都会先查询
如何保证主键唯一?
mysql有“自增主键”机制,从1开始,递增分配主键的值! 如果手动指定X,后续分配根据表中最大值递增;
【PRIMARY KEY auto_increment 】
自动分配局限性!!
单个mysql服务器 it is ok
分布式系统 有多个mysql服务器构成的集群 (比如一个商品表 数据太多 分库分表 多个机器 )此时自动分配 可能重复!
分布式系统生成唯一id的算法公式:
分布式唯一id=时间戳 (插入数据较慢只有时间戳即可) +机房编号/主机编号 +随机因子
!!!!!‘+’ ——字符串拼接
- FOREIGN KEY 外键,保证一个表中的数据匹配另一个表中值的参照完整性
描述两个表之间的关联关系(本质上是两个列的关系,可以修改其他数据);
父表子表都要有“主见”!
create table student(id int primary key,name varchar(20),classId int,foreign key(classId) references class(classId));
其中‘references’之后就是相关外键的表(父表),在执行插入/修改数据操作,会对class表进行查询操作!
在父表中,只可以删除没被子表引用的数据,
在子表中,不可以插入不在父表中的数据;
商品(品1,...)
订单表(ID,品1...)
如何在保留外键约束前提下,实现商品下架?
给商品表加一个单独列,表示是否在线(isok)如果要删除商品,update 把 isok 从1变为0;查询时 加where isok=1 条件;(逻辑删除)
类似的,电脑删除数据,只是标记为无效数据,直到有新文件把这块空间重复利用,原文件才真正消失!
- CHECK 保证列中的值符合指定条件