存储引擎

存储引擎:用于根据不同的机制处理不同的数据。

mysql存储引擎:

​ -innodb:默认存储引擎,支持事务,支持行锁,支持外键

​ -myisam:mysql老版本用的存储引擎

​ -blackhole:存任何数据进去都会立即消失

​ -memory:内存引擎(数据存放在内存中)

查看所有引擎: show engines;

创建表的完成语法

create table 表名(
	字段名1 字段类型(宽度) 约束条件,
    字段名2 字段类型(宽度) 约束条件
);

1.宽度指的时对存储数据的限制
create table user_info(name char);
insert into user_info('lll');
'''
没有安全模式的数据库版本能够存放数据,但只能存进去一个l,
最新数据的版本直接报错:Date too long for colum 'name'
'''

2.约束条件初识:null与not null
create table t1(id int, name char not null);
#正常存储
insert into t1 values(1,'t');
#报错
insert into t1 values(2,null);

#注意
#1.字段名与字段类型都是必须的,宽度和约束条件可选
create table t1(id);

#2.同一张表中字段名不能重复
create table t1(id int, id int);  #报错

#3.最后字段后不能加逗号
create table t1(id int,); #报错
'''
总结:类型与约束条件的区别
		类型:限制字段必须以什么杨的数据类型存储
		约束条件:约束条件是在类型之外添加一种额外的限制
	
'''

数据类型

建表时,字段都有对应的数据类型

*整型

*浮点型

*字符类型char,varchar

*日期类型

*枚举与集合

#整型:tinyint,smallint,mediumint,int,bigint

#tinyint
1)默认有正负符号限制:
默认范围(128,127)
create table t2(id tinyint);
#超出限制,不能插入
insert into t2 values(-129),(256);

2)无符号限制:unsigned  范围变为(0,255)
create table t3(number tiny unsigned);
#报错
insert into t3 values(-10),(256);


#int:int默认最大展示位数11位
create table t4(id int);
#默认范围是(-2147483648, 2147483647) 超出范围报错

#注意:整型后的宽度 如 int(8)不是限制长度,而是控制展示数据的位数,8位以内以空格不全,超出则正常显示




#浮点型:float,double,decimal
#应用场景:身高,体重,薪资
#存储限制:
float(255,30)
double(255,30)
decimal(65,30)     #前一位表示所有位数,后一位表示小数个数

#精确度验证:
create table t4(n float(255, 30));
create table t5(n double(255, 30));
create table t6(n decimal(65, 30));

#float精确到小数点后7位
insert into t4 values(1.1111111111111111111111111111);
#double精确到小数点后15位
insert into t5 values(1.1111111111111111111111111111);
#decimal小数点后30位都精确
insert into t6 values(1.1111111111111111111111111111);
#字符类型:varchar char
#应用场景:姓名,地址,描述信息
1.char:定长
#超出四个字符报错,不够四个字符空格不全
create table t7(name char(4));

#char类型特点:无法查看字符真实长度,针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中,但是会在读出结果的时候自动去掉末尾空格

2.varchar:不定长
#超过四个字符报错,不够四个有几个存几个
create table t8(name varchar(4));


3.char varchar 比较
'''
char:
	-浪费空间
	-存取速度块
	
varchar:
	-节省空间
	-存取速度慢
'''
'''
日期类型: 用字符串存
date:年-月-日
time:时:分:秒
datetime:年-月-日 时:分:秒        
year:年
timestamp时间戳
'''
create table teacher(
	id int,
    name varchar(16),
    born_year year,
    birth date,
    work_time time,
    register_time datetime
);

insert into teacher values(1, 'lll', now(), now(), now(), now());

#枚举与集合
#枚举enum 多选一
#集合set 多选一 或多选多

#枚举
create table user1(
	id int,
    name char(16),
    gender enum('male', 'female')
);
#报错
insert into user1 values(1,'lll','others');
#正确
insert into user1 values(1,'lll','male');


#集合
create table user2(
	id int,
    name char(16),
    gender enum('male','femael'),
    hobbies set('reading','running','singing')
);
#多选一
insert into user2 values(1,'lll','male','reading');
#多选多
insert into user2 values(2.'zzz','male','reading,running');
#注意:reading running 必须连着写

约束条件

约束条件就是对数据库表插入数据时加以约束

#约束条件介绍
-primary key(pk)
	标识该字段为该表的主键,主键可以是唯一的表示记录

-foreign key(fk)
	标识该字段为该表的外键
	
-not null
	标识该字段不能为空
	
-unique
	限制字段值是唯一的
	
-auto_increment
	标识该字段的值自动增长(整数类型, 并且为主键)

-default
	为该字段设置默认值

-unsigned
	无正负符号
	
-zerofill
	使用0填充空格
#not null + default
create table student(
	id int,
    name char(16) not null,
    gender enum('male', 'female') default 'male'
);

insert into student(id, name) values(1,'lll');
insert into student(id, name, gender) values(2,'qqq','female');

#unique
create table user3(
	id int unique,
    name char(16)
);
insert into user3 values(1,'lll');
#若id已存在则报错
insert into user3 values(1,'zzz');

#联合唯一
create table user4(
	id int,
    name char(16),
    unique(id, name)
);
#若ID与name联合存在则报错
insert into user4 values(1,'lll');
insert into user4 values(2,'lll');
insert into user4 values(1,'zzz');
#primary key + auto_increment:主键+自增
# 约束角度: primary key  == not null + unqiue
create table user7(
	id int primary key
);

# 唯一
insert into user7 values(1);
insert into user7 values(1);

# 不能为空
insert into user7 values(null);

# 注意: primary key 除了约束之外,它还是innodb引擎组织数据的一句,提升查询效率

# 强调:
'''
		1.一张表必须只有一个主键,如果没有设置主键,会从上到下搜索,直到遇到 "第一个"非空且唯一的字段自动设置为主键。
'''
create table user8(
	id int,
  name varchar(16),
  age int not null unique
)engine=innodb;

desc user8;

'''
		2.如果包里没有指定任何可以设置主键的字段,那innodb会采用自己默认的一个隐藏关键字作为主键,隐藏意味着查询你的时候通过这个加速查询。
		索引: 类似于书的目录, 没有主键就相当于一页一页翻着查询。

		3.一张表中通常都应该有一个id字段,并且通常将id字段作为主键。
'''

# 联合主键: 多个字段联合起来作为一个主键,本质上还是一个主键
create table user9(
	id int,
	name varchar(16),
	primary key(id, name)
);
desc user9;

# 主键id作为数据的编号,应该设置为自动递增
create table user10(
	id int primary key auto_increment,
  name varchar(16)
);
desc user10;

insert into user10(name) values('tank');
insert into user10(name) values('sean'),('jason'),('大饼');


 # 若想自增从指定值开始,可插入第一条数据时先指定id的值;
                insert into user4(id, name) values(10, 'tank');
                insert into user4(name) values('sean');  # 11
                insert into user4(name) values('egon');  # 12
                insert into user4(name) values('大鸡哥');  # 13
                
                

# 注意: auto_increment通常加在主键上,并且只能设置给primary key字段。

# 补充:
delete from user10;
# delete删除表的记录或者指定记录,但id不会重置为0
# 删除某一条记录
delete from user10 where id='4';

# 若想要清空id重置为0,可使用truncate user10;
#设置严格模式
# 查看数据库配置中变量名包含mode的配置参数:
show variables like "%mode%";

# 修改安全模式:
set session;  # 局部有效,只在你当前操作的窗口有效
set global session;  # 全局有效,永久有效

# 修改完之后退出当前客户端重新登录即可
set global sql_mode = 'STRICT_TRANS_TABLES';