【MySQL篇】表的束缚

打印 上一主题 下一主题

主题 1032|帖子 1032|积分 3096

目录

前言: 
1,空属性
2,默认值default 
3,列描述 
 4,zerofill
5,主键 
6,自增长 
 7,唯一键
8,外键 
9,综合案例 


前言: 

   在MySQL中,表的束缚用于逼迫保证数据的完备性和同等性。在数据库表中,真正束缚字段的是数据范例,数据范例传送门:CSDN
https://mp.csdn.net/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)
    要求:   

  • 每个表的主外键
  • 客户的姓名不能为空值
  • 邮箱不能重复
  • 客户的性别(男,女)
  1. //创建数据库
  2. mysql> create database d1;
  3. //选择数据库
  4. mysql> use d1;
复制代码
商品:
  1. create table if not exists goods
  2. (
  3. goods_id int primary key auto_increment comment '商品编号',
  4. goods_name varchar(32) not null comment '商品名称',
  5. unitprice int not null default 0 comment '单价,单位分',
  6. category varchar(12) comment '商品分类',
  7. provider varchar(64) not null comment '供应商名称'
  8. );
复制代码
客户:
  1. create table if not exists customer
  2. (
  3. customer_id int primary key auto_increment comment '客户编号',
  4. name varchar(32) not null comment '客户姓名',
  5. address varchar(256) comment '客户地址',
  6. email varchar(64) unique key comment '电子邮箱',
  7. sex enum('男','女') not null comment '性别',
  8. card_id char(18) unique key comment '身份证'
  9. );
复制代码
 购买
  1. create table if not exists purchase
  2. (
  3. order_id int primary key auto_increment comment '订单号',
  4. customer_id int comment '客户编号',
  5. goods_id int comment '商品编号',
  6. nums int default 0 comment '购买数量',
  7. foreign key (customer_id) references customer(customer_id),
  8. foreign key (goods_id) references goods(goods_id)
  9. );
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表