当前位置: 首页 > news >正文

MySQL |表的约束

💓个人主页:mooridy
💓专栏地址:MySQL
关注我🌹,和我一起学习更多计算机的知识
🔝🔝🔝

约束 ,是对表中的数据进行限定,保证数据的正确性、有效性和完整性。

表的约束很多,本文将主要介绍如下几个:
null/not null,default, comment, zerofillprimary keyauto_incrementunique keyforeign key

空属性

空属性包括:NULLNOT NULL

默认为NULL,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。

在这里插入图片描述

在这里插入图片描述

可以看到插入数据时,没有给class_room提供数据就会报错

在这里插入图片描述

默认值

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

mysql> create table person(
    -> name varchar(10) not null,
    -> age int,
    -> gender char(2) default '男');
Query OK, 0 rows affected (0.02 sec)

mysql> desc person; 
+--------+-------------+------+-----+---------+-------+ 
| Field  | Type        | Null | Key | Default | Extra |

+--------+-------------+------+-----+---------+-------+ 
| name   | varchar(10) | NO   |     | NULL    |       |

| age    | int(11)     | YES  |     | NULL    |       |

| gender | char(2)     | YES  |     | 男      |       |

+--------+-------------+------+-----+---------+-------+ 
3 rows in set (0.00 sec)

mysql> insert into person(name) values('tom'); 
Query OK, 1 row affected (0.01 sec)


mysql> select * from person; 
+------+------+--------+ 
| name | age  | gender |

+------+------+--------+ 
| tom  | NULL | 男     |

+------+------+--------+
1 row in set (0.00 sec)

可以看到尽管我们没有对性别字段赋值,该字段仍然有值,且我们指定的默认值。

列描述comment

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

create table if not exists person2(
 name varchar(20) not null comment '姓名',
 age int comment '年龄'',
 gender char(2) not null comment '性别');

注意:列描述需使用单引号'来括住,comment与描述之间有空格。

查看comment

通过desc语句是看不到注释信息的
在这里插入图片描述

只有通过show语句才能看到,在语句末尾加上\G可以格式化内容,使信息看起来更直观。

在这里插入图片描述

注意:

show create table [表名]/G;  



不要漏了create或者table

zerofill # 零填充

有时我们会看到诸如int(5)的类型后面跟数字的型式,这显然不是指明有多少个字节,而是与zerofill搭配使用,以表示数字位数,不足的位数用零补充。

ps:int(5)单独使用没有意义,必须搭配zerofill使用

  • 我们将person2age添加zerofill,并规定位数为5.
alter table person2 change age age int(5) zerofill;

插入后进行查询,发现age列的数据占5位,原本的空位用0进行了填充。

在这里插入图片描述

主键 primary key

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个

主键所在列的类型通常为整数

创建表person3,并将主键设置到id列

mysql> create table if not exists person3(
id int unsigned primary key, 
name varchar(20) not null);

下面我们对主键的性质进行验证:

  • 非空性
    在这里插入图片描述

  • 不可重复
    在这里插入图片描述

  • 一张表最多只能有一个主键
    在这里插入图片描述

  • 删除主键

alter table 表名 drop primary key;

在这里插入图片描述

  • 当表创建好以后但是没有主键的时候,可以再次追加主键
alter table 表名 add primary key(字段列表)

在这里插入图片描述

复合主键

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

注意:一张表逐渐只能一个,但一个主键可以包含多个字段

create table courses1( 
 course_id int comment '课程编号', 
 course_name varchar(20) comment '课程名称', 
 course_type varchar(10) comment '课程类型',
 primary key(course_id,course_name)); 
//course_id,course_name为复合主键

在这里插入图片描述

mysql> insert into courses1 values(1,'english','a');  
Query OK, 1 row affected (0.00 sec)

mysql> insert into courses1 values(1,'english','a');  
ERROR 1062 (23000): Duplicate entry '1-english' for key 'PRIMARY'

//只有两列的数据完全相同时才不行,一列相同仍然可以插入

mysql> insert into courses1 values(2,'english','a');  
Query OK, 1 row affected (0.00 sec)



自增长 auto_increment

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

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长
mysql> create table tt21(
-> id int unsigned primary key auto_increment,
-> name varchar(10) not null default ''
-> );
mysql> insert into tt21(name) values('a');
mysql> insert into tt21(name) values('b');
mysql> select * from tt21;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
+----+------+

唯一键 unique key

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键,怎么办呢?

那么这时我们就可以使用唯一键就可以解决表中有多个字段需要唯一性约束的问题。

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

唯一键和主键的区别:

主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。

举个例子

外键 foreign key

外键用于定义主表和从表之间的关系:

外键约束主要定义在从表上,主表则必须是有主键约束unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

语法:

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

eg. purchase为从表,customer ,goods为主表

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)
)
alter table 从表名 add constraint foreign key(从表上的字段) references 主表名(主表上的字段);
alter table 从表名 add constraint foreign key(从表上的字段) references 主表名(主表上的字段);


综合练习

mysql> create database mall;
Query OK, 1 row affected (0.00 sec)

mysql> use mall;
Database changed
mysql> create table purchase(
    -> order_id int primary key,
    -> customer_id int unique key,
    -> goods_id int unique key,
    -> nums int not null);
Query OK, 0 rows affected (0.02 sec)


mysql> create table goods( 
goods_id int primary key auto_increment, 
goods_namee varchar(20) not null,
 unitprice float(4,2) unsigned default 0,
  catagory varcchar(12), 
  provider varchar(30) not null);
Query OK, 0 rows affected (0.02 sec)

mysql> create table customer(
    -> customer_id int primary key auto_increment,
    -> name varchar(20) not null,
    -> address varchar(60));
Query OK, 0 rows affected (0.02 sec)

mysql> alter table purchase add constraint foreign key(customer_id) references customer(customer_id);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table purchase add constraint foreign key(goods_id) references gooods(goods_id);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

相关文章:

  • Unity Shader编程】之复杂光照
  • Box-Cox变换:让数据服从正态分布的数学魔法
  • node-red s7.net
  • Java 基础面试题
  • 常考计算机操作系统面试习题(一下)
  • Matlab教程001:软件介绍和界面使用
  • 力扣刷题78. 子集
  • Shiro框架漏洞攻略
  • BFS解决FloodFill算法
  • Chrome 133 版本开发者工具(DevTools)更新内容
  • Hadoop集群搭建(hdfs、yarn)
  • SpringBoot古典舞在线交流平台设计与实现
  • 基于Netty框架实现的WebSocket服务器握手认证传参笔记
  • Python包中的“守门员“:深入理解__init__.py的魔法
  • systemd-networkd 的 *.network 配置文件中的 [Network] 和 [Address] 中的 Address 有个什么区别?
  • 云服务器怎么防御ddos攻击呢?
  • M系mac怎么关闭sip
  • 三相永磁同步电机的控制方法之矢量控制
  • MySQL-----视图与索引
  • 搜索引擎工作原理图解:抓取→索引→排名全链路拆解
  • 特朗普将启的中东行会如何影响伊美核谈判?专家分析
  • 多省市已开展现房销售试点,去年全国现房销售面积占比超30%
  • 巴基斯坦称对印度发起军事行动
  • 逆境之上,万物生长
  • 两部门发布山洪灾害气象预警:北京西部、河北西部等局地山洪可能性较大
  • 姜再冬大使会见巴基斯坦副总理兼外长达尔