数据库-----数据类型、完整性约束
一、数据类型
1、数字:
整型:tinyint :有符号范围在(-128,127) 无符号范围在(0,255)使用unsigned
int :int类型后面的存储显示宽度,而不是存储宽度,位数不够用zerofill来用0填充
bigint :
小数:
float:在位数比较短的情况下不精准,
float(m,d) m是全长,d是小数点后个数。m最大值为255,d最大值为30
double:在位数比较长的情况下不精准
double(m,d) m是全长,d是小数点后个数。m最大值为255,d最大值为30
decimal:(如果是用小数,则用推荐使用decimal)
精准
内部原理是以字符串形式去存
decimal[(m[,d])] [unsigned] [zerofill] m是整数部分总个数(负号不算)d是小数点后个数。m最大值为65,d最大为30。
2、字符串:
char(10):简单粗暴,浪费空间,存取速度快
# char类型:定长,简单粗暴,浪费空间,存取速度快
字符串范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
存储char类型的值时,会往右填充空格来满足长度
检索:
当我们打开pad_char_to_full_length SQL模式(设置SQL模式:SET sql_mode="PAD_CHAR_TO_FULL_LENGTH"; 查询sql的默认模式:select @@sql_mode;)查出的结果就不会自动删除尾部的空格。
varchar:精确,节省空间,存取速度慢
# varchar类型:变长,字符长度范围:0-65535 varchar类型存储数据的真实内容,不会用空格填充,就算是空格也会被存起来
length() :查看字节数
char_length() :查看字符数
3、时间类型:
year:YYYY(1901/2155)
date:YYYY-MM-DD(1000-01-01/9999-12-31)
time:HH:MM:SS(-838:59:59/838:59:59)
datetime:YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59)
TIMESTAMP:YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
# 调用mysql自带的now()函数,获取当前类型指定的时间 如下结构:
insert into t1 values(now(),now(),now());
4、枚举类型与集合类型
enum 和 set
enum('vip1','vip2','vip3','vip4'),# 在指定范围内,多选一
set('play','music','read','study') # 在指定范围内,多选多
二、完整性约束
1、not null 和 default
not null 标识该字段不能为空
default 为该字段设置默认值(默认值可以为空)
create table tb1( nid int not null default 2, num int not null );
2、unique
中文翻译:不同的,在mysql中称为单列唯一
# 第一种创建unique create table department( id int, name char(10) unique ); create table department( id int unique, name char(10) unique ); # 第二种创建unique的方式 create table department( id int, name char(10), unique(id), unique(name) );
3、联合唯一
# 联合唯一 只要两列记录 有一列不同 既符合联合唯一的约束 create table services( id int, ip char(15), port int, unique(id), unique(ip,port) );
三、primary key
一个表中可以:
单列做主键
多列做主键(复合主键)
约束:等价于not null unique,字段的值不为空且唯一。
存储引擎默认是(innodb):对于innodb存储引擎来说,一张表必须有一主键。
1、单列主键
# 创建t1表,为id字段设置主键,唯一的不同的记录 create table t1( id int primary key, name char(16) ); insert into t1 values(1,"王")(2,"建"); insert into t1 value(2,"山"); # 会报错,因为id是唯一,已经存在id=2了 # not null + unique的化学反应,相当于给id设置primary key create table t2( id int not null unique, # 相当于primary key name char(16) );
2、复合主键
# 只要id,port其中有一不相同就可以插入 create table t3( ip char(15), port int, primary key(ip,port) );
四、auto_increment
约束:约束的字段为自动增长,约束的字段必须同时被key约束
# auto_increment之前必须加primary key,确保id是唯一且不同 create table student( id int primary key auto_increment, # 这里往进插的时候也可以指定id name varchar(20), sex enum('male','female') default 'male', hobby set('吃','玩','睡') );
# 对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长,
例如:delete from student where id=2,
# 应该用truncate清空表,比起delete一条一条的删除记录,truncate是直接清空表,在删除大表时用它
五、foreign key
创建两张关联表操作:
# 创建表时先创建被关联表,再创建关联表 # 先创建被关联表 create table dep( id int primary key, name varchar(20) not null, descripe varchar(20) not null ); # 再创建关联表(emp表) create table emp( id int primary key, name varchar(20) not null, age int not null, dep_id int, constraint fk_dep foreign key(dep_id) references dep(id) ); # 插入记录时,先往被关联表中插入记录,再往关联表中插入记录 # 如果我们想删除某个部门,并且这个部门的员工表的有关联的记录相继删除,我们需要做一下事情: constraint fk_dep foreign key(dep_id) references dep(id) on delete cascade # 同步删除 on update cascade # 同步更新 # 这是一句话,(不要用逗号隔开)