事务、数据类型和约束
事务
简单地说,事务就是指逻辑上的一组SQL语句操作,组成这组操作的各个SQL语句,执行时要么全成功要么全失败
四大特性
1.原子性(Atomicity)
事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生。
2.一致性(Consistency)
事务发生前和发生后,数据的完整性必须保持一致。
3.隔离性(Isolation)
当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其他的会话是不可见的,多个并发事务之间的数据是相互隔离的。也就是其他人的操作在这个事务的执行过程中是看不到这个事务的执行结果的,也就是他们拿到的是这个事务执行之前的内容,等这个事务执行完才能拿到新的数据。
4.持久性(Durability)
一个事务一旦被提交,它对数据库中的数据改变就是永久性的。如果出了错误,事务也不允撤销,只能通过'补偿性事务'。
事务的开启:
数据库默认事务是自动提交的,也就是发一条sql他就执行一条。如果想多条sql放在一个事务中执行,则需要使用事务进行处理。当我们开启一个事务,并且没有提交,mysql会自动回滚事务。或者我们使用rollback命令手动回滚事务。
数据类型
存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的
-
数值类型
1:tinyint(1个字节)小整数型(0,255)(-128,127)tinyint unsigned(指定使用正数,不能有符号)#********* 2:int(4个字节) 大整数型(0,4294967295)int unsigned(指定使用正数,不能有符号)#****** 3:float 单精度浮点数值 (4个字节)float(10,5)10代表这个数据一共几位,5表示小数点后面保留几位,最大(255,30)一般情况下不指定范围,小数点后面只保留5位,不是很准确,double也是,在能保留的最后一位小数上会四舍五入#*********** 4:double 双精度 浮点数 (8个字节) 5:decimal(65,30)可以精确到小数点后面30位,不写参数,默认是10位的整数
注意:对于整型来说,数据类型后面的宽度并不是存储长度限制,而是显示限制,假如:int(8),那么显示时不够8位则用0来填充,够8位则正常显示,通过zerofill来测试,存储长度还是int的4个字节长度。默认的显示宽度就是能够存储的最大的数据的长度,比如:int无符号类型,那么默认的显示宽度就是int(10),有符号的就是int(11),因为多了一个符号,所以我们没有必要指定整数类型的数据,没必要指定宽度,因为默认的就能够将你存的原始数据完全显示
-
日期类型:
类型:DATE,TIME,DATETIME ,IMESTAMP,YEAR
作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
日期类型分类
1:datetime 年月日时分秒 ******(可以把timestamp的属性写到后面.抄过来,show) 2:date 年月日 ****** 3:time 时分秒 *** 4:year 5:timestamp(约束不能为空,默认当前时间,在修改表数据时同时更新时间) #now()获取当前时间 存储时间时,可以写字符串('2019-8-29 12:01:20').也可以写数字类型(201908291026)但是不能少位数
datetime与timestamp的区别
在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。 1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。 2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。 3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。 4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。
-
字符串类型:
类型:char,varchar
作用:名字,信息等等
char和varchar介绍
#char类型:定长,简单粗暴,浪费空间,存取速度快 字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节) 存储: 存储char类型的值时,会往右填充空格来满足长度 例如:指定长度为10,存>10个字符则报错(严格模式下),存<10个字符则用空格填充直到凑够10个字符存储 检索: 在检索或者说查询时,查出的结果会自动删除尾部的空格,如果你想看到它补全空格之后的内容,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH';) #varchar类型:变长,精准,节省空间,存取速度慢 字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8: 检索: 尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容 1:char (0-255个字节) 定长存储 设置几个就占几个位置,char(10)输入一个'田彩',也占10位, 存储速度快,占用空间(默认为一) 2:varchar (0-65535个字节) 变长存储 只存数输入的长度,比如输入'田彩',站的位数是2+1,这个1是数据的长度,存储速度慢,占用空间小(必须指定长度 ) # 记住这两个就可以了
-
枚举类型与集合类型:
1:enum enum('男','nv'),单选,只能选择括号里的选项 2:set set则是多选,
完整性约束
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致性
主要分为:
# NOT NULL :非空约束,指定某列不能为空;
#DEFAULT :默认值
# UNIQUE : 唯一约束,指定某列或者几列组合不能重复
# PRIMARY KEY :主键,指定该列的值可以唯一地标识该列记录
#AUTO_INCREMENT:约束字段为自动增长,被约束的字段必须同时被key约束
#truncate 表名:清空表
# FOREIGN KEY :外键,指定该行记录从属于主表中的一条记录,主要用于参照完整性
#添加索引:alter table 表名 add 索引名(列名)
#删除唯一索引:alter table 表名 drop index 列名
#删除主键索引 alter table 表名 drop 索引名
#关联表的数据同步的进行更新和删除的效果,所以我们在建表的时候,可以加上两个功能:同步更新和同步删除 on delete cascade和 on update cascade
#NOT NULL
create table t12(id int not null)#id这个字段不能为空
#DEFAULT
create table t13(id int not null,name not null default '33')#如果填充name值则会覆盖默认值
#UNIQUE 唯一约束,不能出现重复的
create table deparment(id int,name varchar(20) unique,comment varchar(100));
#Primary key:主键必须唯一,主键值非空;可以是单一字段,也可以是多字段组合。
#方法一:not null +unique
create table department(id int not null unique,#主键
);
#方法二:在某个字段后使用primary key
create table department(id int primary key#主键
)
#方法三:在所有字段后单独定义priamry key
create table department(id int,parimary key(id))
#方法四:给已经建成的表添加主键约束
create table department(id int);
alter table department modify id int primary key;
#auto_increment约束字段为自动增长,被约束的字段必须同时被key约束
create table student(id int primary key auto_increment);
foreign key
foreign key(外键其实就是标明表和表之间的关系,表和表之间如果有关系的话就三种:一对一,多对一,多对多)
-
多对一
create table Anime(id int primary key auto_increment,name char(10)); insert into Anime (name) values ('龙珠'),('火影忍者'),('秦时明月'); create table people(id int primary key auto_increment,name char(10),aid int not null,foreign key(aid) references Anime(id)); insert into people (name,aid) values ('盖聂',3),('天明',3),('鸣人',2),('悟空',1),('小樱',2); select * from Anime; select * from people;
-
一对一
create table skill(id int primary key auto_increment,name char(10)); insert into skill (name) values('烤山鸡'),('螺旋丸'),('龟派气功'),('怪力'),('地爆天星'),('百步飞剑'); create table people(id int primary key auto_increment,name char(10),sid int not null,foreign key(sid) references skill(id)); insert into people (name,sid) values ('盖聂',6),('天明',1),('鸣人',2),('悟空',3),('小樱',4); select * from skill; select * from people;
-
多对多
mysql create table people(pid int primary key auto_increment,name char(10)); insert into people (name) values ('鸣人'),('自来也'),('木叶丸'),('阿斯玛'); create table skill(sid int primary key auto_increment,name char(10)); insert into skill (name) values ('螺旋丸'),('影分身'),('手里剑'),('灰烬烧'),('仙人模式'); create table peopletoskill(id int primary key auto_increment,pid int,sid int,foreign key(pid) references people(pid),foreign key(sid) references skill(sid)); insert into peopletoskill (pid,sid) values (1,1),(1,2),(1,3),(1,5),(2,1),(2,5),(3,1),(3,2),(3,4),(4,3),(4,4); select * from people; select * from skill; desc peopletoskill; select * from peopletoskill;