IT评测·应用市场-qidao123.com

标题: 【MySQL篇】表的束缚 [打印本页]

作者: 去皮卡多    时间: 2025-3-9 17:54
标题: 【MySQL篇】表的束缚
目录

前言: 
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,空属性



示例:

   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填充。具体看操作.

   mysql> create table t14( a int unsigned not null, b int unsigned 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;
  



   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操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

自增长的特点:

示例:
   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');
  
 


   mysql> show create table t17\G
  
 




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

  
 





 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
  
 

 


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

 


9,综合案例 

   有一个市肆的数据,记录客户及购物环境,有以下三个表组成:   
    要求:   
  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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4