字段类型与约束条件
一、概念
1、创建表的完整语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
宽度:对储存数据的限制
2、在创建表的时候有三点你需要注意的地方:
①在一张表内字段名不能重复
②字段和类型是必须要有的,而宽度和约束条件是可选的
③最后一个字段后面不能加逗号!!!
3、创建今天的库:
create database day38; use day38; create table t1(name char); insert into t1 values('jason') 出现两种情况: ①能够成功但是显示的时候只有一位 ②直接报错 select * from t1;
4、约束条件::
create table t2(name char(16) not null); # 输入的名字不能为null
5、字段类型与约束条件之间的关系:
字段类型限制的是存储数据的类型
约束条件是基于字段类型之上的附加的额外限制
二、字段类型
1、整形
分类:tinyint smallint mediumint int bigint
作用:年龄,等级等信息
①tinyint类型:
tinyint默认有正负号 create table t3(id tinyint); -128——256 create table t4(id tinyint unsigned); # 设置为无符号 0——255
②int类型:
int默认有正负号 create table t5(id int); alter table t5 modify id int unsigned; # 设置为无符号
给整形设置宽度 (*****):
特例:唯独整型字段在设置宽度的时候,限制不是存储宽度而是显示宽度(*****) create table t6(int int(8)); 如果存入的数字够8位 正常显示,如果不够8位默认用空格填充 create table t7(id int(8) zerofill); zerofill:不够8位用0填充 在创建整型字段的时候,不需要指定字段宽度(整型的显示宽度)(*****)
设置严格模式:
mode like模糊查询 %:匹配任意数量的任意字符 _:匹配单个数量的任意字符 show variables like "%mode%"; set global sql_mode = "STRICT_TRANS_TABLES"; 设置完成后需要退出客户端,重新登录客户端即可,不需要重启服务端
2、浮点型
①分类: float double decimal ②作用:薪资,体重,身高 ③浮点类型(5,3) 总长度为5位其中小数位占3位整数位两位 float(255,30) double(255,30) decimal(65,30) ④三者区别:精度不同: 精度由低到高 float double decimal create table t10(id float(255,30)); create table t11(id double(255,30)); create table t12(id decimal(65,30)); insert into t10 values(1.11111111111111111111111); insert into t11 values(1.11111111111111111111111); insert into t12 values(1.11111111111111111111111);
3、字符串类型(char与varchar)
①char:定长 ②varchar:变长 create table t13(name char(4)); # name字段固定存储四个长度,如果超了直接报错,如果不够默认用空格填充 create table t14(name varchar(4)); # name字段如果超了直接报错,如果不够按实际长度存储 insert into t13 values('a'); 'a ' insert into t14 values('a'); 'a' select * from t12 select * from t13 # 无法查看真正的结果 char_length(name) # 统计字段值所对应的长度 select char_length(name) from t13; select char_length(name) from t14; # 仍然无法查看到真正的结果,这时就要再一次设置严格模式
再次设置严格模式:
首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式 set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
char与varchar的比较:
char(4) 定长 优点:存取速度都快,简单粗暴 缺点:浪费空间 varchar(4) 变长 给varchar类型的数据自动加上报头用来标识数据的长度,报头通常占1~2bytes 缺点:存取速度都慢 优点:节省空间
4、日期类型
date 年月日 time 时分秒 datetime 年月日时分秒 year 年 create table t15( id int, birth date, class_time time, reg_time datetime, yy year ); insert into t15 values(1,"2000-01-21","11:11:11","2019-01-21 11:11:11","2019");
5、枚举与集合类型
枚举(enum):多选一 create table t16( id int, name char(6), gender enum('male','female','others') ); insert into t16 values(1,'egon','xxx'); 报错 insert into t16 values(1,'egon','male'); 性别为male 集合(set):多选多 虽然是多选多但是你可以只选一个 create table t17( id int, name char(6), gender enum('male','female','others'), hobby set('read','DJ','DBJ','run') ); insert into t17 values(1,'tank','male',"read,DBJ,DJ"); insert into t17 values(1,'tank','male',"DBJ");
三、约束条件
primary key 标识该字段为该表的主键,可以唯一的标识记录 foreign key 标识该字段为该表的外键 not null 标识该字段不能为空 unique key 标识该字段的值是唯一的 auto_increment 标识该字段的值自动增长(整数类型,而且为主键) default 为该字段设置默认值 unsigned 无符号 zerofill 使用0填充
1、not null:标识该字段不能为空
create table t20(id int,name char(4) not null); 不传名字会报错
2、default:为该字段设置默认值
create table t21( id int, name char(4), gender enum('male','female','others') default 'male' ); insert into t21 values(1,'egon'); # 报错 insert into t21(id,name) values(1,'egon'); 通常情况下not null和default是配合使用的
3、unique:标识该字段的值是唯一的
# 单列唯一 create table t22( id int unique, # 单个字段 name char(16) ); insert into t22 values(1,'egon'),(1,'tank'); # 报错 insert into t22 values(1,'egon'),(2,'tank'); # 联合唯一:服务器ip和port create table t23( host char(16), port int, unique(host,port) # 多个字段 ); insert into t23 values('127.0.0.1',8080),('127.0.0.1',8081); insert into t23 values('127.0.0.1',8080),('127.1.1.1',8080);
4、primary key:标识该字段为该表的主键,可以唯一的标识记录
innodb引擎中,所有的表都必须有且只有一个主键,它是innodb引擎用来组织数据的依据
单从限制条件上来说,它就相当于not null + unique 非空且唯一
create table t26( id int primary key, name char(16) )engine=innodb;
强调:
①一张表中必须有且只有一个主键,如果你没有设置主键, 那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键
create table t25( id int, name char(16), age int not null unique, addr char(16) not null unique )engine=innodb; desc t25; # 查看
②如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键, 隐藏意味着你在查询的时候无法根据这个主键字段加速查询了
索引:类似于书的目录,没有主键就相当于一页一页翻着查
③一张表中通常都应该有一个id字段,并且通常将改id字段作成主键
5、auto_increment:标识该字段的值自动增长(整数类型,而且为主键)
注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加
主键id作为数据的编号,每次最好能自动递增
create table t27( id int primary key auto_increment, name char(16) ); insert into t27(name) values('jason'),('jason'),('jason'); # id字段自动从1开始递增
联合主键:
create table t28( ip char(16), port int, primary key(ip,port) ); desc t28; # 查看
四、创建一张数据库表
执行结果: