【MySQL篇】表的约束

目录

前言: 

1,空属性

2,默认值default 

3,列描述 

 4,zerofill

5,主键 

6,自增长 

 7,唯一键

8,外键 

9,综合案例 


前言: 

在MySQL中,表的约束用于强制保证数据的完整性和一致性。在数据库表中,真正约束字段的是数据类型,数据类型传送门:优快云https://mp.youkuaiyun.com/mp_blog/creation/editor/145947883但是数据类型的约束很单一,所以需要一些额外的约束,来保证数据的完整性和正确性。表的约束有很多,这里主要介绍如下几个:

null / not null,default,comment,zerofill,primary key,auto_increment,unqiue key



 

1,空属性

  •  两个值:null和not null,一般情况下,如果不指明,默认为null
  • 数据库默认字段都是空,但在实际开发中,尽可能保证字段不为空,因为数据为空时无法参与运算

示例:

  • 创建一个班级表 ,包含班级名和所在的教室。

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

  • 插入数据 

insert into myclass values ('高三一班','101');
insert into myclass values (null,'101');//err不能插入空值
insert into myclass values ('高三一班',null);//err不能插入空值

 

2,默认值default 

插入数据时,若未指定字段,则使用默认值。

示例:

create table t11(
    -> name varchar(20) not null,
    -> age tinyint unsigned default 10,
    -> sex char(2) default '男');

数据在插入时,不给字段赋值就是用默认值。

 insert into t11 (name,age) values ('张三',18);

insert into t11 (name,age,sex) values ('李四',20,'女');
insert into t11 (name,sex) values ('王五','男');
insert into t11 (name) values ('赵六'); 

 补充:我们可以查看建表时我们设置了那些约束

show create table t11\G

在创建表时,如果没有指明字段的约束,系统会将字段的默认值default设置为null 

3,列描述 

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,起到注释的作用

示例:

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

通过desc查看不到注释信息,通过show可以查看到 

 4,zerofill

zerofill的作用如果宽度小于给定的宽度,就用0填充。具体看操作.

  • 首先创建包含int类型的表

mysql> create table t14( a int unsigned not null, b int unsigned not null);

  • 将字段b修改为int unsigned zerofill not null

mysql> alter table t14 modify  b int unsigned zerofill not null;

  •  查看表的信息

mysql> show create table t14\G

可以看到int(10),这个10所表示的含义是b这个数的宽度,如果插入的数据宽度小于10,就补0,如果宽度大于10,就按原数据插入。而为什么是10呢?因为无符号int的取值范围是42亿多,宽度是10。 

  • 向表中插入数据

mysql> insert into t14 values (1,1);
 

mysql> insert into t14 values (1,11111111);
 

mysql> insert into t14 values (2,222);
 

mysql> select * from t14;

  • 修改字段a的约束为int(5) unsigned zerofill  

mysql> alter table t14 change b b int(5) unsigned zerofill;

  • 查看表的信息和内容 

mysql> show create table t14\G
mysql> select * from t14;

可以看到,对于int(10),没有zerofill属性,括号内的值毫无意义。

5,主键 

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

示例:

  • 创建表的时候直接在字段上指明主键

mysql> create table t15(
    -> id int unsigned primary key comment '学号不能为空',
    -> name varchar(20) not null);

 

  • 主键约束:主键对应的字段不能重复,一旦重复,操作失败。 

  •  删除主键

alter table 表名 drop primary key;

 

  • 当表创建以后但是没有主键的时候,可以再次追加主键   

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

 

  •  复合主键

在创建表的时候,在所有字段之后,使用primary key来创建主键,如果有多个字段做主键,使用复合主键。

mysql> create table t16(
    -> id int unsigned,
    -> course char(10) comment '课程',
    -> score tinyint unsigned default 60 comment '成绩',
    -> primary key(id,course));

 

从上图可以看出字段id和course都是主键,id和course共同构成一个主键,站在业务角度,可以保证一个学生对应的学号id,在选课程course时不能选择重复的课程。示例:

  • 插入数据

mysql> insert into t16 (id,course) values (1,'数据结构');
 

mysql> insert into t16 (id,course) values (1,'算法设计与分析');
 

mysql> insert into t16 (id,course) values (1,'操作系统');
 

mysql> insert into t16 (id,course) values (2,'数据结构');
 

mysql> insert into t16 (id,course) values (2,'算法设计与分析');
 

mysql> insert into t16 (id,course) values (2,'操作系统');
 

mysql> insert into t16 (id,course) values (1,'操作系统');//err主键冲突
mysql> insert into t16 (id,course) values (1,'数据结构');//err主键冲突

 

 

  • 查看表中的数据

6,自增长 

auto_increment:当对应的字段,不给值,会自动的被形同触发,系统会从当前已有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键

自增长的特点:

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏不为空)
  • 自增长字段必须是整数
  • 一张表只能有一个自增长

示例:

mysql> create table t17(
    -> id int unsigned primary key auto_increment,
    -> name varchar(10) not null);

 

  • 插入数据 

mysql> insert into t17 (name) values ('a');
 

mysql> insert into t17 (name) values ('b');
 

mysql> insert into t17 (name) values ('c');

 

  •  通过show可以查看auto_increment信息

mysql> show create table t17\G

 

  • 当我们插入新的id时,再次插入时会从该值+1 

  • 在创建表的时候,也可以指明auto_increment的值 

mysql> create table t18(
    -> id int unsigned primary key auto_increment,
    -> name varchar(20) not null)auto_increment=100;

 

  • 可以通过调用函数last_insert_id(),获取上次插入的auto_increment值

  • auto_increment必须和主键搭配使用  

 7,唯一键

  • 一张表中往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
  • 唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
  • 关于唯一键和主键的区别: 我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。

 举一个例子:

假设一个场景:
比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,一个身份证号码,一 个是员工工号,我们可以选择身份号码作为主键。

而我们设计员工工号的时候,需要一种约束:所有的员工工号都不能重复。
具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束,那么就可以将员工工号设计成为唯一键。
一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整。

示例:

mysql> create table student(
    -> id char(10) unique key comment '学号',
    -> name varchar(10));

 

  • 插入数据 (可以插入空值)

 

8,外键 

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

作用:维护表间的引用完整性,防止无效数据插入。 

语法:

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

其中学生表为从表,班级表为主表。

示例:

  • 创建班级表和学生表,学生表中有外键约束

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

mysql> create table student(

    ->id int primary key,

    ->name varchar(20) not null comment '学生名',

    ->class_id int,

    ->foreign key(class_id) references class(id));

 

  • 正常插入数据

mysql> insert into class values (1,'软件101');

mysql> insert into class values (2,'软件102');

mysql> insert into class values (3,'软件103');

 

mysql> insert into student values (100,'张三',1);
 

mysql> insert into student values (200,'李四',2);
 

mysql> insert into student values (300,'王五',3);
 

mysql> insert into student values (400,'赵六',3);
 

mysql> insert into student values (500,'田七',4);//err

  • 插入一个班级id为4的学生,因为没有这个班级,所以插入不成功 

 

 

  • 插入一个班级id为null的,表示该学生还没有分配班级 

mysql> insert into student values (500,'田七',null);

 

 



9,综合案例 

有一个商店的数据,记录客户及购物情况,有以下三个表组成:
  • 商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供应商
  • provider)
  • 客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)
  • 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)
要求:
  • 每个表的主外键
  • 客户的姓名不能为空值
  • 邮箱不能重复
  • 客户的性别(男,女)
//创建数据库
mysql> create database d1;
//选择数据库
mysql> use d1;

商品:

create table if not exists goods
(
goods_id int primary key auto_increment comment '商品编号',
goods_name varchar(32) not null comment '商品名称',
unitprice int not null default 0 comment '单价,单位分',
category varchar(12) comment '商品分类',
provider varchar(64) not null comment '供应商名称'
);

客户:

create table if not exists customer
(
customer_id int primary key auto_increment comment '客户编号',
name varchar(32) not null comment '客户姓名',
address varchar(256) comment '客户地址',
email varchar(64) unique key comment '电子邮箱',
sex enum('男','女') not null comment '性别',
card_id char(18) unique key comment '身份证'
);

 购买

create table if not exists purchase
(
order_id int primary key auto_increment comment '订单号',
customer_id int comment '客户编号',
goods_id int comment '商品编号',
nums int default 0 comment '购买数量',
foreign key (customer_id) references customer(customer_id),
foreign key (goods_id) references goods(goods_id)
);

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值