存储引擎
存储引擎:用于根据不同的机制处理不同的数据。
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';