属性的类型和作用,属性用来约束和控制表字段。
*空属性 *默认值属性 *主键 *自动增长 *唯一键 *字段描述
属性:建立在字段类型之后,对字段除类型之外的其他约束
*属性是在定义表字段的时候针对每个字段进行属性设定 *设定好的属性可以通过查看表字段desc进行查看 *数据在进行增删改(写)操作时需要在满足字段的要求同时还要满足属性的要求
eg:查看表属性:desc 表名
desc t_1; # Field:字段名字 # Type:数据类型 # Null:是否为空(属性) # Key:索引类型(属性) # Default:默认值(属性) # Extra:额外属性NULL:数据是否允许为空
*默认情况下数据是允许为空的 *不为空设计:Not Null *数据为空一般不具备运算和分析价值,所以通常数据都需要设定为Not Null(不区分大小写)
步骤 1、数据类型确定
2、数据是否为空确定 *允许为空:不用考虑Null属性(默认为Null) *不允许为空:Not Null eg:用户信息表:用户名,密码,姓名,年龄,注册时间
create table t_2( username varchar(50) not null, password char(32) not null, name varchar(20), age tinyint unsigned, reg_time int unsigned not null )charset utf8; ##如果字段不能为空(Not Null),那么数据就必须满足条件:插入时不能为空的字段就需要主动提供值 insert into t_2 values('username','password','Jim',20,123456789); # 错误操作:reg_time不能为空,而默认为空,所以系统报错 insert into t_2 (username,password) values('username','password');默认值:default,在设计表字段的时候给定默认数据,在后续字段操作(数据新增)的时候系统没有检测到字段有数据的时候自动使用的值
*默认值在字段设计的时候使用(默认值需要满足数据类型规范) *默认值通常设计的是字段容易出现的数据 一般字段的默认值默认是Null *默认值触发 在系统进行数据插入时自动检测触发 主动使用default关键字触发默认值
步骤 1、确定字段的数据类型
2、确定字段可能出现的数据会是某个经常出现的值
3、设定默认值
4、触发默认值
自动触发:数据插入时不给字段赋值 手动触发:数据插入时主动使用default关键字
eg:用户去开户:银行卡账号,身份证号,姓名,账户余额。
create table t_3( account varchar(19) not null, id_card char(18) not null, name varchar(20) not null, money decimal(16,2) default 0.00 not null )charset utf8; # 默认触发 insert into t_3 (account,id_card,name) values('6226000000000001','44011120001212000x','Lily'); # 主动触发 insert into t_3 values('6226000000000002','440111200012120011','Tom',default); insert into t_3 values('6226000000000003','440111200012120022','Jim',100);主键:primary key,用来保证整张表中对应的字段永远不会出现重复数据 *主键在一张表中只能有一个 *主键的另外一个特性是能够提升主键字段作为查询条件的效率(索引) *主键不能为空:Not Null(默认)
逻辑主键:数据没有具体业务意义,纯粹是一种数值数据 逻辑主键通常是整数:int 逻辑主键目的是方便检索和数据安全(不暴露数据真实信息)
复合主键:多个字段共同组成不能重复的数据 primary key(字段1,字段2,…字段N) 联合主键使用不多,一般也不会超过2个字段
步骤 1、确定字段数据具有唯一性
2、确定数据不允许为空
3、确定数据会经常用于数据检索(条件查询)
4、使用主键primary key
5、一般每张表都会使用一个逻辑主键(id)
eg:银行账户信息:账户,姓名,余额
# 银行账户具有唯一性,不能重复,也不允许为空 create table t_4( account varchar(17) primary key, name varchar(20) not null, money decimal(16,2) not null default 0.00 )charset utf8; # 复合主键 create table t_5( account varchar(17), name varchar(20), money decimal(16,2) not null default 0.00, primary key(account,name) )charset utf8; # 一般使用逻辑主键 create table t_6( id int unsigned primary key, account varchar(17) not null, name varchar(20) not null, money decimal(16,2) not null default 0.00 )charset utf8; #主键数据不允许重复 insert into t_6 values(1,'6226000000000001','Lily',default); # 错误:主键1已经存在 insert into t_6 values(1,'6226000000000002','Tom',default); # 联合主键就是联合字段加起来不重复即可 insert into t_5 values('6226000000000001','Tom',default); insert into t_5 values('6226000000000002','Tom',default);主键管理:在创建表并且已经有数据后的维护
*删除主键 *追加主键 *修改主键(先删除后新增)
eg:删除主键,再新增主键
alter table t_5 drop primary key; alter table t_5 add primary key(account,name);自增长:auto_increment,被修饰的字段在新增时,自动增长数据
*自增长只能是整数类型,而且对应的字段必须是一个索引(通常逻辑主键) *一张表只能有一个自动增长 *自增长数据可以理解为一种默认值,如果主动给值,那么自动增长不会触发 *自增长由两个变量控制 初始值:auto_increment_offset,默认是1 步长:auto_increment_increment,默认值也是1 查看自增长控制:show variables like ‘auto_increment%’;
步骤 1、确定数据类型为整型
2、确定数据需要有规则的变化 *从1开始 *每次增长1 *可以调整,但是通常有固定规则(一般不调整)
3、必须是一个索引字段(逻辑主键)
4、使用auto_increment
eg:记录学生信息
# 学生信息:学号自动增长 create table t_7( id int primary key auto_increment, stu_no int(8) zerofill not null, stu_name varchar(20) not null )charset utf8; # 使用自增长(可以使用NULL或者default来触发) insert into t_7 values(null,1,'Jim'); insert into t_7 values(default,2,'Tom'); # 主动控制:自增长的值会从当前最大的值开始自动增长 insert into t_7 values(10,3,'Lily'); insert into t_7 values(null,4,'Lucy');自增长管理:在某些特殊使用下,需要自增长按照需求实现
修改表中自增长的值:让下次自增长按照指定值开始
修改自增长控制:调整自增长的变化
eg:修改表中自增长的值,跳过一些值,直接从下次开始按照新的目标值出现
alter table t_8 auto_increment = 50; ##注:奇数会保留原值,偶数会自动加1 #修改自增长控制:步长,起始值,针对整个数据库 set auto_increment_increment = 2; # 当前用户当前连接有效(局部) set @@auto_increment_increment = 2; # 所有用户一直有效(全局)唯一键:unique key,用来维护数据的唯一性
*一个表中可以有多个唯一键 *唯一键与主键的区别在于唯一键允许数据为Null(而且Null的数量不限) *唯一键与主键一样,可以提升字段数据当做条件查询的效率(索引) *复合唯一键:多个字段共同组成 unique key(字段1,字段2,…字段N) 一般不会出现,最多2个字段组成
步骤 1、确定数据列具有唯一特性
2、确定数据列不用作为主键
3、确定数据会经常用于检索条件
4、唯一键字段是否允许数据为空 *为空:普通唯一键 *不为空:not null(唯一键与主键效果一样)
5、使用唯一键
eg:用户表
create table t_9( id int primary key auto_increment, username varchar(50) unique comment '唯一键,可以直接在字段之后增加,使用unique关键字', password char(32) not null )charset utf8; insert into t_9 values(null,'username','password'); insert into t_9 values(null,Null,'password'); insert into t_9 values(null,Null,'password'); # 错误 insert into t_9 values(null,'username','password1');eg:学生成绩表
# 学号和学科编号共同组成唯一 create table t_10( id int primary key auto_increment, stu_name varchar(20) not null, course varchar(20) not null, score decimal(5,2), unique key(stu_name,course) )charset utf8; insert into t_10 values(null,'Jim','Math',50); insert into t_10 values(null,'Jim','English',80);唯一键管理:在表创建后对唯一键的管理
*删除唯一键:一张表中不止一个唯一键,所以删除方式是相对麻烦: alter table 表名 drop index 唯一键名字; *新增唯一键:alter table 表名 add unique key(字段列表);
eg:删除&追加
alter table t_11 drop index `stu_name`; alter table t_11 add unique key `stu_course` (stu_name,course);描述:comment,是用文字描述字段的作用的
*comment代表的内容是对字段的描述 方便以后自己了解字段的作用 方便团队了解字段的作用
*描述如果涉及到字符集(中文)一定要在创建表之前设置好客户端字符集(否则会出现描述乱码)
步骤 1、字段命名不是特别简单
2、使用comment增加简易描述
eg:
# 学生成绩表中通常是存储学生学号 # 学科通常也是学科代码 create table t_12( id int primary key auto_increment, stu_no varchar(10) not null comment '学号', course_no varchar(10) not null comment '课程号', score decimal(5,2) comment '考试成绩', unique key `stu_course` (stu_no,course_no) comment '学号和课程号组成唯一键' )charset utf8;*如果要查看描述信息,需要使用show create table查看
1、字段属性是基于字段类型对数据控制后,再进行其他控制(辅助加强字段类型对数据的控制)
2、巧妙的利用好字段属性,能够帮助我们更好的保证数据的有效性、安全性
3、字段属性与字段类型通常是搭配使用,常见的属性有
主键(逻辑)+自增长 唯一键+Not Null(Null数据不参与运算,没有价值) 默认值以及default关键字的使用
数据库记录长度:MySQL中规定一条记录所占用的存储长度最长不超过65535个字节
*记录长度为表中所有字段预计占用的长度之和 *所有字段只有允许Null存在,系统就会预留一个字节存储Null(多个Null也只要一个就好) *因为MySQL记录长度的存在,varchar永远达不到理论长度 GBK存储:65535(字符) * 2 + 2 = 131072(字节) UTF8存储:65535(字符) * 3 + 2 = 196607(字节) *一般数据长度超过255个字符都会使用text/blob进行存储(数据存储不占用记录长度)
步骤 1、字符串字段如果超过长度255字符,使用text/blob替代
2、所有字段是否有允许为Null的,如果有要占用1个字节
3、计算字段所占用的预计总长度不要超过65535个字节
eg: 1、GBK表能存储的最大varchar字符串长度
create table t_13( content varchar(65535) )charset gbk; # 错误 create table t_13( content varchar(32767) )charset gbk; # 错误 create table t_13( content varchar(32766) )charset gbk;2、UTF8表能存储的最大varchar字符串长度
create table t_14( content varchar(65535) )charset utf8; # 错误 create table t_14( content varchar(21844) )charset utf8;3、Null也要占用一个字节
create table t_15( id tinyint, content varchar(21844) )charset utf8; # 错误 create table t_15( id tinyint not null, content varchar(21844) not null )charset utf8;