ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL基本数据类型及约束条件

2022-02-20 23:05:21  阅读:191  来源: 互联网

标签:约束条件 insert int create 数据类型 values MySQL table id


内容概要

  • 存储引擎

  • MySQL基本数据类型

    整型
    浮点型
    字符类型
    日期类型
    枚举与集合类型
    
  • 约束条件

    unsigned
    zerofill
    not null
    default
    unique
    primary key
    

内容详细

存储引擎

# 存储引擎可以看成是处理数据的不同方式

# 查看存储引擎的方式
	show engines;
    
# 需要掌握的四个存储引擎
	myISAM
    	MySQL5.5之前默认的存储引擎
        	支持事务、行级锁和外键 针对数据的操作较于InnoDB不够安全
	InnoDB
    	MySQL5.5之后默认的存储引擎
        	支持事务、行级锁和外键 针对数据的操作更加的安全
	memory
    	基于内存存储数据
        	速度最快但是断电立刻丢失
	blackhole
    	写入其中的数据都会立刻消失 类似于垃圾处理站
	
# 存储引擎创建表的不同点
	creatr table t1(id int) engine=myisam;
    creatr table t2(id int) engine=innodb;
    creatr table t3(id int) engine=memory;
    creatr table t4(id int) engine=blackhole;
    
"""
MyISAM会创建三个文件
	.frm	表结构文件
	.MYD	表数据文件
	.MYI	表索引文件(索引是由来加快数据查询的)
InnoDB会创建两个文件
	.frm	表结构文件
	.ibd	表数据和表索引文件
memory
	.frm	表结构文件
blcakhole
	.frm	表结构文件
"""

MySQL基本数据类型

# 1.整形
	tinyint	smallint	int	bigint
    不同的int类型能够存储的数字范围是不一样的
    	1.要注意是否存负号(正负号需要占一个比特位)
        2.针对手机号码只能用bigint
	"""研究默认是否需要正负号"""
        create table t5(id tinyint);
        insert into t5 values(-999),(999);
	# 结论:所有的int类型默认都需要正负号
    	create table t6(id tinyint unsigned);	# 移除正负号
        insert into t6 values(-999),(999);
        
# 2.浮点型
	float		double		decimal
    float(255,30)	# 总共255位 小数位占30位
    double(255,30)	# 总共255位 小数位占30位
    decimal(65,30)	# 总共65位 小数位占30位
    """研究三者的不同"""
    create table t7(id float(255,30));
    create table t8(id float(255,30));
    create table t9(id float(65,30));
        insert into t7 values(1.11111111111111111111111);
    insert into t8 values(1.11111111111111111111111);
    insert into t9 values(1.11111111111111111111111);
    # 结论:三者的精确度不一样
    	float < double < decimal
        
    """
    到底使用哪个?
    	一般情况下小数点后面只保留两位 所以float足矣
    	如果是从事高精密业务 则需要考虑更高的精确度
    ps:有时候很多看似需要用数字存储的数据 可能都是存的字符串
    课外扩展:python本身对数字的精确度很低 之所以能够从事人工智能和数据分析完全得益于功能强大的模块
    """
    
# 3.字符类型
	char(4)
    	定长类型 最多只能存四个字符 多了报错少了自动空格填充至四个
	carchar(4)
    	变长类型 做多只能存四个字符 多了报错少了有几个则存几个
	"""研究上述特征"""
    create table t10(id int,name char(4));
    create table t11(id int,name varchar(4));
    insert into t10 values(1,'jason');
    insert into t11 values(1,'jason');
    # 针对5.6版本超出班委不会报错 而是自动帮你截取并保存(此行为不合理)
    方式1:修改配置文件(永久)
	方式2:命令修改(暂时)
        show variables like '%mode%'
        set session	# 当前窗口有效
        set global	# 当前服务端有效
        	set gloabl sql_mode = 'strict_trans_tables'
		修改完毕后退客户端重进进入即可 再次执行上述插入命令 会直接报错
	# 研究定长与边长特性
    	insert into t1o values(2;'j');
        insert into t11 values(2;'j');
        # 统计某个字段数据的长度 char_length()
        例:select char_length(name) from t10 where id=1;
	'''底层确实会填充 但是取出来的时候又会自动去除'''
    set global sql_mode = 'strict_trans_tables,pad_char_to_full_length'

char与varchar的对比

char;
	优势:整取整存 速度快
	劣势:浪费存储空间
varchar;
	优势:节省空间
	劣势:存取优势的速度较char慢
"""
char(5)
	jasontony kevintom oscartank sean jerry
varchar(5)
	1bytes+jason1bytes+tony1bytes+kevin1bytes+tom1bytes
	存:先计算数据的长度
	取:先获取报头的数据
"""
# 以前几乎用的是char 现在很多情况下使用varchar
	进了公司之后 会通过邮件告诉你每个字段的英文名和中文名及类型等项目的诸多信息
    
补充:在创建字段的时候可以加上相应的注释
    关键字comment
    create table t12(
        id int comment '序号',
        name char(4) comment '姓名'
    );

整型中括号内数字的作用

create table t13(id int(3));
insert into t13 values(8888888);
"""
在整型中括号内的数字并不是用来限制存储的长度 而是用来控制展示的长度
我们以后在定义整型字段的时候 不需要自己添加数字 使用默认的就可以
"""
create table t14(id int(3) zerofill);
insert into t14 values(4);
# 结论:整型比较特殊 是唯一一个不是用来限制存储长度的类型

枚举与集合类型

枚举
	多选一
enum()
	create table user(
    	id int,
        name varchar(32),
        gender enum('male','female','others')
    )
        insert into user values(1,'jason','男');  # 报错
    insert into user values(1,'jason','male');  # 正常
    
集合
	多选多(包含了多选一)
set()
	create table userinfo(
    	id int,
        name char(16),
        hobby
set('baskerball','football','volleyball'
    )
    );

日期类型

date			年月日
datetime		年月日时分秒
time			时分秒
year			年份

create table client(
	id int,
    name varchar(32),
    reg_time date,
    birth datetime,
    study_time time,
    join_time year
);
insert into client values(1,'jason','2000-11-11','2000-1-21 11:11:11','11:11:11',1995);

创建表的完整语法

create table 表名(
	字段名1 字段类型(数字) 约束条件,
    字段名2 字段类型(数字) 约束条件,
    字段名3 字段类型(数字) 约束条件
)
"""
1.字段名和字段类型是必须的
2.数字和约束条件是可选的 并且 约束条件可以有多个 空格隔开即可
3.最后一个语句的结尾不要加逗号
"""

约束条件

"""
约束条件相当于是在字段类型的基础之上添加的额外约束
	eg:id int unsigned
"""
unsigned		让数字没有正负号
zerofill		多余的使用数字0填充
not null		非空
	"""
	新增表数据的方式
		方式1:按照字段顺序一一传值
			insert into t1 values(1,'jason');
		方式2:自定义传值顺序 甚至不传值
			insert into t1(name,id) 		values('jason',1);
			insert into t1(id) values(1);
	在MySQL中不传数据 会使用关键字NULL填充意思就是空 类似于python中的None
	"""
    
    creatr table t2(
    	id int,
        name varchar not null
    );
default		默认值
	"""
	所有的字段都可以设置默认值
		用户不给该字段传值则使用默认的 否则使用传的
	create table t3(
		id int default 911,
		name varchar(16) default 'jason'
	);
	"""
    
unique			唯一值
	"""
	单列唯一
		create table t4(
			id int ,
			name varchar(32) unique
		);
	"""
    联合唯一
    	create table t5(
        	id int,
            host varchar(32),
            port int,
            unique(host,port)
        );

promary key		主键
	"""
	但从约束层面上来说 相当于是 not null +unique(非空且唯一)
	在此基础之上 还可以加快数据的查询
	
	InnoDB存储引擎规定了一张表必须有且只有一个主键
		因为InnoDB是通过主键的方式来构造表的
		如果没有设置主键
			情况1:没有主键和其他约束条件
				InnoDB会采用隐藏的字段作为主键 不能加快数据的查询
			情况2:没有主键但是有非空且唯一的字段
				自动将该字段升级位主键
				create table t6(
					id int,
					age int not null unique,
					pwd int not null unique
				);
	结论:
		以后我们在创建表的时候一定要设置主键
		并且主键字段一般都是表的id字段(uid sid pid cid)
		create table user1(
			id int primary key,
			name varchar(32)
		);
	"""
auto_increment		自增
	"""
	由于主键类似于数据的唯一标识 并且主键一般都是数字类型
	我们在添加数据的时候不可能记住接下来的序号是多少 太麻烦
	create table user1(
			id int primary key auto_increment,
			name varchar(32)
		);
	"""

自增的特性

自增不会因为删除操作而后退
	delete from无法影响自增
如果想要充值需需要使用truncate关键字
	truncate 表明	# 清空表数据并且重置主键值

标签:约束条件,insert,int,create,数据类型,values,MySQL,table,id
来源: https://www.cnblogs.com/henry1998/p/15916884.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有