主键约束
- 什么是主键:表示表中数据唯一性的字段称为主键
- 添加主键约束的字段,值唯一且非空。
-格式: create table emp(id int primary key,name varchar(10));
insert into emp values(1,'Tom');//成功
insert into emp values(2,'Jerry');//成功
insert into emp values(1,'abc');//失败 id不能重复
insert into emp values(null,'abc');//失败 主键不能为null
主键+自增
-格式:create table t1(id int primary key auto_increment,name varchar(10));
insert into t1 values(null,'刘备');
insert into t1 values(null,'刘备');
insert into t1 values(10,‘张飞’);
- 当自增字段的值为null时会自动赋值并且数值+1
- 可以指定赋值
- 自增数值只增不减 不会因为删除数据而减少
- 在表中曾出现过的最大值的基础上+1
注释 comment
-格式:create table t2(id int primary key auto_increment comment '这是id表示唯一性', name varchar(10) comment '这是名字', sal int comment '这是工资');
-查看方式: show create table t2;
`和' 的区别
- `是用来修饰表名和字段名的 可以省略
- ' 是用来修饰字符串的
数据冗余
- 什么是冗余:如果表设计不够合理,随着数据量的增多,可能会出现大量的重复数据,这种重复数据成为数据冗余,可以通过拆分多个表的形式解决此问题
事务
- 创建人物表 create table person(id int primary key auto_increment,name varchar(10),money int);
- 插入两条数据 insert into person values(null,'超人',500),(null,'钢铁侠',50000);
-
超人和钢铁侠借10000块钱
- 让钢铁侠-10000 update person set money=money-10000 where id=2;
- 让超人+10000 update person set money=money+10000 where id=1;
-
什么是事务:事务是数据库中执行SQL语句的工作单元,可以保证事务内的SQL语句要么全部成功,要么全部失败。
- 如何使用事务:
- 把数据库的自动提交改成手动提交,
- 执行多条sql语句,此时SQL会在内存中执行
-
当所有SQL在内存中执行完后 手动提交,把多次改动一次性提交到数据库文件中
-
查看数据库自动提交的状态 show variables like '%autocommit%';
- 关闭和打开自动提交 0:关闭 1:开启 set autocommit=0;
- 验证事务的步骤:
- 在A窗口中执行让钢铁侠-10000 update person set money=money-10000 where id=2;
- 此时在A窗口中执行select * from person 验证数据时被改掉的,但是此时显示的内容是内存中的数据
- 打开新的B窗口执行select * from person 因为此时数据查询的是数据库文件中的数据,此时并没有发生改变
- 在A窗口中执行让超人+10000 update person set money=money+10000 where id=1;
- 此时A窗口查询数据改变(内存中数据),B窗口数据没变(数据库文件中数据)
- 回到A窗口执行commit; 手动提交,此时B窗口查询数据也发生了改变,因为A窗口中已经把两次内存中的改动提交到了数据库文件中。
为什么使用事务?
当做某一件事需要执行多条SQL语句的时候(类似转账),如果不使用事务,则可能出现多条SQL部分成功部分失败,这样的结果会导致数据错乱,使用事务后可以保证多条SQL语句要么全部成功,要么全部失败。可以解决以上问题
事务的执行流程?
所谓开启事务实际上就是把数据库的自动提交关闭改成手动提交,在手动提交之前多次SQL语句的执行只会对内存中的数据进行更改,当提交的时候会把多次SQL的执行结果一次性提交到数据库文件中
事务回滚
- 事务回滚会把内存中的数据回滚到上次提交的点
- 设置回滚点: savepoint 标识;
- 回滚到某个回滚点: rollback to 标识;
事务相关指令总结:
- show variables like '%autocommit%';
- set autocommit=0/1;
- commit;
- rollback;
- savepoint s1;
- rollback to s1;
SQL分类
- DDL:Data Definition Language 数据定义语言,包括:create,alter,drop,truncate。不支持事务
- DML:Data Manipulation Language 数据操作语言,包括:insert delete update 和 select(DQL)。支持事务
- DQL:Data Query Language 数据查询语言,只有select
- TCL:Transaction Control Language 事务控制语言,包括:commit,rollback,savepoint,rollback to xxx;
- DCL:Data Control Language 数据控制语言,分配用户权限相关的SQL
truncate
- 删除表并创建一个新表(空表)
- 格式: truncate table 表名;
- truncate、drop、delete区别: 执行效率drop>truncate>delete, drop只是删除表,truncate是删除表并创建一个空表,delete只是删除数据自增数值不会清零
数据库的数据类型
- 整数: int(m) bigint(m) m代表显示长度 zerofill(零填充) create table tint(num int(10) zerofill); insert into tint values(123);
- 浮点数: double(m,d) m代表总长度,d代表小数长度 如:76.234 m=5 d=3;
- decimal(m,d) 超高精度浮点数,涉及超高精度运算时使用。
- 字符串
- char(n): 固定长度 n=10 'abc' 占10 执行效率高,最大长度255
- varchar(n):可变长度 n=10 'abc' 占3 更节省空间,最大长度65535,超过255建议使用text。
- text: 可变长度 最大65535。
- 日期类型
- date: 保存年月日
- time: 保存时分秒
- datetime: 保存年月日时分秒 默认值为null,最大值9999-12-31
- timestamp(时间戳):保存年月日时分秒 默认值为当前时间,最大值2038-1-19