Mysql-数据类型及表约束

表的数据类型

tinyint

有符号:-128~127, 无符号:0~255, 默认有符号

create table t1(num tinyint);
insert into t1 values(1);
insert into t1 values(128); --越界报错

无符号:

create table t2(num tinyint unsigned);
insert into t2 values(-1); --报错
insert into t2 values(255);

float

float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

float(4, 2)表示的范围有符号数是-99.99~99.99,无符号数是0~99.99mysql在保存数值时会自动进行四舍五入

create table t3(id int, salary float(4, 2));
insert into t3 values(1, -99.99);
insert into t3 values(2, -99.991); --四舍
insert into t3 values(3, 99.986); --五入

 decimal

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

decimal(5, 2)表示的范围是-999.99~999.99,这样来看decimal和float很像,但是两者表示的精度不一样

create table t4(id int, num1 float(10, 8), num2 decimal(10, 8));
insert into t4 values(1, 21.21335432, 21.21335432);
select * from t4;

这样看来,还是decima的精度更高一些,所以希望小数的精度更高,推荐使用decimal

char和varchar

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是 65532。

当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844(因为utf中,一个字符占用3个字节),如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节).

所以数据长度如果都一样,就使用定长(char),数据长度有变化,就使用变长(varchar).

日期和时间

datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从1000到9999,占用八字节
date:日期 'yyyy-mm-dd',占用三字节
timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss格式和datetime完全一致,占用四字节

enum和set

enum,可以理解为单选类型,设定提供了多个选项的值,最终一个单元内只存储了一个值

set,可以理解为多选类型,设定提供了多个选项值,最终一个单元格内可以存储多个值

创建一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单 选]:

create table votes(
    name varchar(30),
    hobby set('登山', '游泳', '篮球', '武术'),
    gender enum('男', '女')
);

插入数据:

insert into votes values('李四', '登山', '女');
insert into votes values('张三', '游泳,武术', '男');

表的约束

空属性

虽然数据类型能够约束字段,但是数据类型比较单一,需要一些其他的约束,比如在学生表中,E-mail可以为空,但是姓名学号不能为空。我们可以创建一个班级表,表中必须要有班级和教室的名字,如果没有这两个就不知道在哪上课:

create table myclass(
    class_name varchar(20) not null,
    class_room varchar(20) not null
);

查看表结构,不允许为空:

默认值

使用关键字default,某一个属性经常性的出现某一个具体的值,可以在一开始指定好,在使用时,用户可以选择性的使用默认值

create table t6(
    name varchar(20) not null,
    age tinyint unsigned default 0,
    sex char(2) default '男'
);

插入数据,不指定字段值,使用默认值

insert into t6 (name) values ('张三');
select * from t6;

列描述 

列描述在创建表时没有实际意义,用来描述该字段,跟据表创建语句保存

create table t7 (
    name varchar(20) not null comment '姓名',
    age tinyint unsigned default 0 comment '年龄',
    sex char(2) default '男' comment '性别'
);

一般用desc语句查看不到注释信息,使用下面语句查看,\G是以列显示:

show create table t7\G;

zerofill

格式化输出,如果宽度小于设定的宽度(这里设置的是 ),自动填充0。要注意的是,这只是最后显示的结果。

主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

创建表的时候直接在指定字段上添加:

create table t8(
    id int unsigned primary key comment '学号不为空',
    name varchar(20) not null
);

在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主 键,可以使用复合主键。

create table t9(
    id int unsigned,
    course char(10) comment '课程代号',
    score tinyint unsigned default 60 comment '成绩',
    primary key(id, course) --组合主键
);

创建表之后追加主键

alter table 表名 add primary key(字段列表)

删除主键 

alter table 表名 drop primary key

自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作, 得到一个新的不同的值。

通常和主键搭配使用,作为逻辑主键。

自增长的特点: 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)

                       自增长字段必须是整数

                       一张表最多只能有一个自增长

create table t10(
    id int unsigned primary key auto_increment,
    name varchar(20) not null
);

插入数据,可以不指定id

insert into t10 (name) values ('张三');
insert into t10 (name) values ('李四');
select * from t10;

 唯一键

unique 一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有 多个字段需要唯一性约束的问题。

唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

create table t11(
    id char(10) unique comment '不能重复,可以为空',
    name varchar(20)
);

外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当 定义外键后,要求外键列数据必须在主表的主键列存在或为null。

foreign key (字段名) references 主表(列)

创建主键表

create table class(
    id int primary key,
    name varchar(20) not null comment '班级名'
);

创建从表

create table stu(
    id int primary key,
    name varchar(20) not null comment '学生名',
    class_id int,
    foreign key (class_id) references class(id)
);

综合案例

有一个商店的数据,记录客户及购物情况,有以下三个表组成:

    1、商品goods(商品编号goods_ id,商品名goods_ name, 单价unitprice, 商品类别category, 供应商provider)

    2、客户customer(客户号customer_ id,姓名name,住址address,邮箱email,性别sex,身份证card_id)

    3、购买purchase(购买订单号order_ id,客户号customer_ id,商品号goods_ id,购买数量nums)

要求:

    每个表的主外键

    客户的姓名不能为空值

    邮箱不能重复

   客户的性别(男,女)

--创建goods表
create table goods(
	goods_id int unsigned primary key auto_increment,
	goods_name varchar(100) not null default '',
	unitprice decimal(10, 2) not null default 0.0,
	category smallint not null default 0,
	provider varchar(100) not null default ''
);

--创建customer
create table customer(
	customer_id int unsigned primary key auto_increment,
	name varchar(50) not null default '',
	address varchar(100) not null default '',
	email varchar(60) not null unique,
	sex enum('男','女') not null default '男',
	card_id varchar(20) not null unique
);

--创建purchase
create table purchase (
	order_id varchar(30) not null primary key,
	customer_id int unsigned,
	goods_id int unsigned,
	nums int not null default 0,
	foreign key(customer_id) references customer(customer_id),
	foreign key(goods_id) references goods(goods_id)
);

猜你喜欢

转载自blog.csdn.net/yikaozhudapao/article/details/83653365