MySQL基本数据类型和约束方式
常用数据类型
1.mysql中的基本数据类型
整型、浮点型、字符类型、日期类型、枚举和集合。
2.常用的约束条件
PRIMARY KEY、UNIPUE KEY、NOT NULL、FOREIGN KEY。
基本建表的语法
1.基本建表的语法:create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
2.在建表的时候都需要注意的点:
1.在同一张表中,字段名不可以重复;
2.在创建表中,字段宽度和约束条件是可选的,字段名和类型是一定要有的;
3.在创建表的最后一个字段名后不能加逗号
3.补充
1)宽度指的是对存储数据的限制
在MySQL5.5以上的版本中,有一个安全模式,在低版本的MySQL中是可以将数据插入进去的,所有不用感到有疑问。
2)约束条件not null
4.总结:类型与约束条件的区别
类型:用来限制字段必须用怎样的类型来存储
约束条件:是在字段类型以外的额外限制
严格安全模式
我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式
1)使用指令 show variables like '%mode%';
2.set session # 只在当前操作界面有效
set global # 全局有效
3.set global sql_mode ='STRICT_TRANS_TABLES'
4.修改完成后重启客户端即可
数据类型的深层理解
1.整型
分类:TINYINT SMALLINT MEDIUNINT INT BIGINT
作用:存储年龄、等级、id、各种号码等
验证整型的有效范围:
create table t1(x tinyint); insert into t1 values(128),(-129); create table t2(x tinyint unsigned); insert into t2 values(-1),(256); create table t3(x int unsigned); insert into t3 values(4294967296);
2.浮点型
分类:float、double、decimal
作用:身高、体重、薪资
# 存储限制 float(255,30) double(255,30) decimal(255,30) # 精确度验证 create table t9(x float(255,30)); create table t10(x double(255,30)); create table t11(x decimal(65,30)); insert into t9 values(1.111111111111111111111111111111); insert into t10 values(1.111111111111111111111111111111); insert into t11 values(1.111111111111111111111111111111);
3.字符型
分类:char(定长)、varchar(变长)
作用:姓名、描述类信息
create table t10(name char(4)) # 超出四个字符报错,不够四个字符空格补全 create table t11(name varchar(4)) # 超出四个字符报错,不够四个有几个就存几个 # 验证存储限制 insert into t12 values('hello'); insert into t13 values('hello'); # 验证存储长度 insert into t12 values('a'); #'a ' insert into t13 values('a'); #'a' select * from t12 select * from t13 # 无法查看真正的结果 select char_length(name) from t12 select char_length(name) from t13 # 仍然无法查看到真正的结果 """首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉""" # 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式 set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH"; # 退出客户端重新登陆 select char_length(x) from t12; #4 select char_length(y) from t13; #1 # 针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中。但是会在读出结果的时候自动取掉末尾的空格 """ char与varchar的使用区别 """ name char(5) # 缺点:浪费空间 # 优点:存取速度都快 egon alex lxx jxx txx name varchar(5) # 缺点:存取速度慢 # 优点:节省空间 1bytes+egon 1bytes+alex 1bytes+lxx 1bytes+jxx 1bytes+txx
4.时间类型
分类:date、time、datetime、year
5.枚举和集合
约束条件
约束条件的分类:
""" PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NOT NULL 标识该字段不能为空 UNIQUE KEY (UK) 标识该字段的值是唯一的 AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键) DEFAULT 为该字段设置默认值 UNSIGNED 无符号 ZEROFILL 使用0填充 """
1.not null+default
create table user( id int, name char(16) ); insert into user values(1,null) # 可以修改 alter table user modify name char(16) not null; insert into user(name,id) values(null,2); # 报错 插入数据可以在表名后面指定插入数据对应的字段 create table student( id int, name char(16) not null, gender enum('male','female','others') default 'male' ) insert into student(id,name) values(1,'jason') # 成功
2.unique
# 单列唯一 create table user1( id int unique, name char(16) ); insert into user1 values(1,'jason'),(1,'egon') # 报错 insert into user1 values(1,'jason'),(2,'egon') # 成功 # 联合唯一 create table server( id int, ip char(16), port int, unique(ip,port) ) insert into server values(1,'127.0.0.1',8080); insert into server values(2,'127.0.0.1',8080); # 报错 insert into server values(1,'127.0.0.1',8081);
3.
# 单从约束角度来说primary key就等价于not null unique create table t11(id int primary key); desc t11; insert into t11 values(1),(1); # 报错 insert into t11 values(1),(2); # 除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率 """ 强调: 1.一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键 """ create table t12( id int, name char(16), age int not null unique, addr char(16) not null unique )engine=innodb; desc t12; """ 2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了 索引:类似于书的目录,没有主键就相当于一页一页翻着查 3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键 """ # 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键 create table t18( ip char(16), port int, primary key(ip,port) ); desc t18; # 主键id作为数据的编号,每次最好能自动递增 create table t13( id int primary key auto_increment, name char(16) ); insert into t13('jason'),('jason'),('jason'); # id字段自动从1开始递增 # 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加
4.补充
delete from tb1;
强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,
所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录
delete from tb1 where id > 10;
如果要清空表,使用truncate tb1;
作用:将整张表重置,id重新从0开始记录