字符类型, 日期和时间类型, 表和字段的约束(主键/外键, 自增长, zerofill)

本文探讨了数据库中字符类型、日期和时间类型,以及enum和set的数据结构。此外,还详细介绍了表和字段的约束,如主键、外键、自增长和zerofill属性的使用和限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 字符类型

	1.1 固定长度的字符串 char(L): L不是占用字节的大小, 而是字符串的长度; 字符占用字节的数量和数据库的编码格式息息相关;
		char(10): 10 * 类型所用的字节
		LATIN1: 一个字符占用1个字节
		utf8: 一个字符占用3个字节			
			eg: char(4): 4 * 3 = 12字节  --utf8字符集

	1.2 varchar(L): 可变长度的字符串. L表字符长度, 到底可以存储多少个字符和数据库的编码格式息息相关, 可变意思是在小于固定长度下想开多少就可以开多少
		理论上可以存储65535个字符;但是编码格式表示字符并不是1个字节来表示, 而是用n个字符来表示, 则字符串的长度为(65535-(1到3))/n.
	1.3 区别: 
		a. char而言, 定义了之后就开辟好空间了,对varchar而言, 在定义的范围内, 存储多少字符串, 就开辟多大的空间 !!!
		b. 但是对于varchar类型,并不是可以超过固定的字符串长度
			eg: varchar(100): 存储小于等于100的字符都可以开空间, 但是大于100就不行(告诉你存储不了), 但是char是字符串多大就开多大 char快, varchar慢(char已经开好了, varchar才去开辟, 但是一般用是varchar)
		c. 对于varchar类型需要用到1-3字节来保存字符串长度;

	utf8类型: 1个字符占用3个字节
		(65535-3)/3 = 21844


  1. 日期和时间类型
2.1 datename: 时间日期类型, 格式: YYYY-MM-DD HH:mm:SS
	这个类型需要程序员自己插入时间
2.2 date类型: 只表示年月日, 占用三个字节
2.3 timestamp: 时间戳类型  从1970年开始, 表示的年月日 时分秒YYYY-MM-DD HH:mm:SS (自动补全时间, 可以自己计算当中的年月日 时分秒)

	字段1(v1, v2, v3, v4);
	不仅只能插入一个, 还可以插入包含多个的一项 v1,v2/v1,v2,v3,v4/...(在这些选项里只能选一个)
  1. enum:
    枚举了很多值, 但是只能在其中选择一个, 如果插入不是枚举出来的值, 就会报错;
  2. set:
    列举出来很多值, 可以选择其中的任意多个值进行组合保存, 如果不是列举出来的值, 就会报错

表的约束:

6. 定义字段的时候, 需要有一个类型, 这样的一个类型, 有时候并不能满足我们对列数据的一个约束;
	例如: 
		表字段是否可以为NULL? 有没有默认值? 表字段的解释能不能加上?
		对于数字类型的字段可以不可以直到默认表示的位数?
		可不可以将这个字段设置成为唯一标识该行数据的呢???

对于字段的约束:

1. 空属性:
	NULL: 标识当前字段可以为NULL
	NOT NULL: 标识当前字段不可以为NULL, 列的字段指定该属性之后, 在插入数据的时候, 如果不插入该列的数据, 则会报错 !
2. 默认值:
	default:
		可以在创建表字段的时候, 指定一个默认值, 当我们插入数据的时候, 没有插入该字段的时候, 就采用默认属性; 
		如果插入数据的会后指定值, 则采用插入值, 而非是默认值
3. 列描述:
	就相当于列的备注, 告诉查看该表的用户, 该字段是什么含义, 对于存储数据而言, 并没有实质的约束; 只是供人们来查看该列的含义的, 就相当于C++当中的日志

4. zerofill:
	约束了数字的宽度, 如果宽度不够则用0进行填充
		eg: 1   宽度为3, 表示的时候则为001
	如果指定了zerofill, 则会默认加上unsigned, 无符号属性; 在数据库当中还是存储原来的数值的值; 只不过在查询的时候, 会按照宽度进行输出, 宽度不够, 则用0填充;
	相当于格式化输出

5. 主键:
	5.1 对于主键而言, 并不是重新开辟了一个新的列, 而是表当中的一列被设置的属性, 这种属性被称之为主键;
	5.2 主键的属性保证了该列数据不能为空, 不能重复
	5.3 一个表当中只能有一个主键, 不能有多个主键
	5.4 通常情况下, 主键在设置的时候, 都是整形类型, 主键的这一列数据可以唯一标识一行数据( 一个班有很多同学, 都有名字,可能会重复, 但是身份证号码绝不会重复,可以作为主键来作为设置, 主键所对应的行也会有这样的属性--> 只能标识人)
	5.5 如何设置主键 ?
		a. 在创建表的时候, 直接在字段的后面加上关键词"primary key", 就可以设置该字段为主键
			create table t6(id primary key, name varchar(20));
		b. 在创建表的时候, 将所有字段全部指定完毕之后, 在所有字段的后面, 加上设置主键的关键词, 并且加上指定字段的名称
			create table t7(id int, name varcahr(20), primary kay(id));
		c. 在创建表的时候, 可以不知道主键列, 创建完成后, 使用alter关键字来增加主键;
			alter table t8 add primary kay(id);
	5.6 如何删除主键?
		使用alter关键字加上drop可以删除
			alter table t8 drop primary key;
		主键列的值可以唯一标识该行数据, 因为主键不能为空, 不能重复的原因 ! ! !
		主键索引: 通过主键来构建一颗B+数, 在用户进行检索数据的时候, 如果约束条件(查找条件)为主键, 则会大大的提高搜索效率, 因为B+的搜索效率高, 可以找到主键对应的一行数据;

自增长:
	当我们设置一个字段为自增长的时候, 如果插入数据的时候, 不给该列数据, 则系统会自动填写一个比上一行数值加1的数值填写进去
	通常自增长 搭配主键来使用, 主键不可以重复, 每次自增长都会给新的数据分配比上一行+1数值;
	条件:
		a. 首先字段必须是一个整数, 字段类型需要是一个整数类型
		b. 一张表当中最多只能有一个自增长的列
		c. 搭配主键来使用
	使用: auto_increment
		AUTO_INCREMENT=3 (表示着下一次插入数据的时候, auto_increment列预分配的值
	获取上次自增加的值, 函数为last_insert_id() ---> 这个函数只能拿到系统自增加的值(对于用户自己插入的id他是拿不到的)

6. 外键:
	用于定义主表和从表的一个约束关系; 
		主表: 就是存放我们基础属性的表(一般用来描述当前表当中的数据用来描述基础的属性)
			例如: 班级属性表(班级id, 班级属性(文科, 理科), 班级名称)
		从表: 存放具体的用户产生的信息
			例如: 学生属性(学生id, 学生名字, 班级id)

	1. 定义主表当中可能成为其他表外键的字段, 一定需要将该字段设置成为主键或者唯一键, 因为主键不能重复, 不能为空, 可以唯一标识一行数据(例如上面的班级属性)
	2. 定义从表的时候, 设置外键其实就是设置了一个关系, 当前从表的字段和主表当中的字段的关系, 在从表当中插入数据的时候, 会对插入数据进行校验, 校验的标准插入的数据是否存在 在 主表列字段中 

	外键就是添加了表和表之间的约束关系 ! ! !
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值