# 一、约束条件

**约束条件**

|约束条件|说明|

|:---:|:---:|

|`zerofill`|零值填充约束|

|`unsigned`|无符号约束|

|`not null`|非空约束|

|`default`|默认值约束|

|`unique key`|唯一约束 |

|`auto_increment`|自增长约束|

| `primary key` |主键约束|

| `foreign key` |外键约束|

## 1.1 `zerofill`零值填充约束

**当传入字段的数据宽度不够时,使用0进行填充**

```sql

create table zero_fill(id int(3) zerofill);

insert into zero_fill values(1);

select * from zero_fill;

```

![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/233845_f9e60a9a_7841459.png "屏幕截图.png")

## 1.2 `unsigned`无符号约束

**对于数值类型的数据进行的约束**

```sql

create table unsigned_table(id int unsigned);

insert into unsigned_table values(-10),(200); --开启严格模式,插入负数报错

insert into unsigned_table values(0),(200);

```

![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/234302_a19242ba_7841459.png "屏幕截图.png")

## 1.3 `not null`非空约束

**非空约束的字段,在插入值时必须进行插入; 如果不插入则报错**

```sql

create table not_null(id int, name varchar(20) not null);

insert into not_null values (1, "小兰");

insert into not_null(id) values (2); -- 非空字段未插入值,报错

```

![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/234644_6c0cf0a8_7841459.png "屏幕截图.png")

## 1.4 `default value`默认约束

**插入值时,如果没有指定值;则自动填充默认值**

```sql

create table default_value(id int, gender enum("male", "female", "other") default "male");

insert into default_value(id) values(1); -- 非默认值,要指定字段插入

insert into default_value values(2, "female");

```

![输入图片说明](https://images.gitee.com/uploads/images/2020/1119/235145_fcfd9591_7841459.png "屏幕截图.png")

## 1.5 `unique key`唯一约束

**有些字段中的值必须唯一的,使用此约束条件**

* **单列唯一**

```sql

create table unique_key(id int unique key, name char(4));

insert into unique_key values(1, "小明"), (1, "小芳"); -- 报错

insert into unique_key values(1, "小明"), (2, "小芳");

```

![输入图片说明](https://images.gitee.com/uploads/images/2020/1120/000156_97de721e_7841459.png "屏幕截图.png")

* **联合唯一**

> 对于单个字段可以重复,联合起来不能重复,

```sql

create table unique_key2(

id int,

ip varchar(30),

port int,

unique key(ip, port) -- 设置联合唯一

);

insert into unique_key2 values(1, "127.0.0.1", 8080); -- 成功

insert into unique_key2 values(2, "127.0.0.1", 8081); -- 成功

insert into unique_key2 values(2, "127.0.0.1", 8080); -- 失败

```

![输入图片说明](https://images.gitee.com/uploads/images/2020/1120/000756_ffe4f72a_7841459.png "屏幕截图.png")

## 1.6 `primary key`主键约束

> 1. **非空且唯一**

> 2. `Innodb`存储引擎,在创建表时必须使用`primary key`。

> * 一张表中有且只有一个主键

> * 如果没有出现主键约束,则 **第一次出现not null unique key** 约束的做为主键

> * 如果没有设置主键,也没有设置`not null unique key`, `Innodb`会采用内部的隐藏字段做为主键. 这个字段不能使用

> 3. **通常将`id`字段做为表的主键**

```sql

create table primary_key1(id int primary key);

create table primary_key2(

id int not null unique key,

addr char(32) not null unique key

);

create table primary_key3(

id int,

name char(16),

primary key(id, name)

);

```

![输入图片说明](https://images.gitee.com/uploads/images/2020/1120/144527_1bfdf746_7841459.png "屏幕截图.png")

![输入图片说明](https://images.gitee.com/uploads/images/2020/1120/144835_aa056826_7841459.png "屏幕截图.png")

## 1.7 `auto_increment` 自增长约束

> 一张表中只有 **一个** 字段自增长。 **非空且唯一** 的字段才可以添加自增长约束

>

> **通常是给主键添加约束的**

>

> 数据删除后,不会清空计数器, 也即是: 自增长继续

>

> **truncate tb_name;** 清空tb_name中的数据,并重置计数器

```sql

create table auto_increment_table(

id int primary key auto_increment,

name char(5)

);

insert into auto_increment_table(name) values("小明"),("小芳");

```

![输入图片说明](https://images.gitee.com/uploads/images/2020/1120/145544_ae0eed70_7841459.png "屏幕截图.png")

# 二、表关系

设计数据库时,我们要尽量将不同的信息存放在不同的表之中。

> 1. 解耦合,对于数据的扩展性好。

> 2. 提高了数据的查询和修改效率,降低存储空间。

如果在设计数据库时,将所有数据存放到一个表之中的后果

> 1. 浪费存储空间, 对于不同的记录之间的数据项可能存在相同的数据

> 2. 修改某个字段的效率低, 如果修改的字段存在多个相同的值,那么修改数据时,这些相同的值都会发送改变,增加了数据库服务的压力(**后果非常严重**)

## 2.1 `foreign key`外键约束

> 1. 用于约束字段只能填充某张表中 **已经存在** 的值

> 2. 用于实现表之间的关系

## 2.2 表关系

创建表时,需要考虑表关系;需要双向考虑。

### 2.2.1 一对多

对于 **学生和学院的关系** , **学生只能在一个学院** ,但是 **学院可以有多个学生, _也即是: 多个学生对应一个学院_ **, (学生和学院之间的关系位 **单向一对多关系** , 也即是 **一对多关系** )。

```sql

-- 创建学院表

create table academy(

academy_id int primary key auto_increment,

academy_name varchar(20)

);

-- 创建学生表

create table student(

student_id int primary key auto_increment,

student_name varchar(20),

student_gender int,

ac_id int,

foreign key(ac_id) references academy(academy_id) -- 当前表字段ac_id与 表academy表(academy_id)关联

on update cascade -- 同步更新

on delete cascade -- 同步删除

);

insert into academy(academy_name) values("计算机"),("理学院"),("人文");

insert into student(student_name, student_gender, ac_id) values("小明", 1, 1),("小芳", 2, 3), ("小兰", 2, 3), ("小蓝", 1, 2);

```

> 1. 创建外键约束时,**在多的一方创建外键约束**

> 2. 创建表时,**先创建被关联表**

> 3. 录入数据时,**先录入被关联表**

> 4. **外键约束语法**: **`foreign key(字段) references 表名(字段)`**。

> 5. 被关联表(`academy`)中没有的数据,不能在关联表(`student`)中插入。

> 6. 如果被关联表(`academy`)中的数据被插入到了关联表(`student`),则被关联表(`academy`)中的被关联字段(`academy_id`)的数据不能修改, 也不能删除此条记录。

> 7. 如果要修改被关联表(`academy`)中的被关联字段(`academy_id`)的数据,则应当对关联表(`student`)中的关联字段(`ac_id`)一起修改。

> 8. 如果要删除被关联表(`academy`)中的被关联字段(`academy_id`)的数据,则应当对关联表(`student`)中的关联字段(`ac_id`)一起删除。

> 9. 级联更新,级联删除。**`foreign key(字段) references 表名(字段) on update cascade on delete cascade`**

![输入图片说明](https://images.gitee.com/uploads/images/2020/1120/160511_54db8bcf_7841459.png "屏幕截图.png")

![输入图片说明](https://images.gitee.com/uploads/images/2020/1120/160536_7032653d_7841459.png "屏幕截图.png")

![输入图片说明](https://images.gitee.com/uploads/images/2020/1120/160731_0f373d2a_7841459.png "屏幕截图.png")

![输入图片说明](https://images.gitee.com/uploads/images/2020/1120/160831_95aacc3c_7841459.png "屏幕截图.png")

### 2.2.2 多对多

对于作者和作品的关系;一部作品可以有多个作者编写,一名作者也可以编写多本书。(作者和作品 之间存在 **双向的一对多关** 系,也即是: **多对多关系**)

```sql

-- 创建作者表

create table author(

id int primary key auto_increment,

name varchar(10),

age int,

book_id int,

foreign key(boo_id) references book(id)

on update cascade -- 同步更新

on delete cascade -- 同步删除

);

-- 创建book表

create table book(

id int primary key auto_increment,

book_name varchar(20),

price float,

author_id int,

foreign key(author_id) references author(id)

on update cascade -- 同步更新

on delete cascade -- 同步删除

);

```

> 如果这样创建表存在如下问题

> 1. 创建表`author`时,需要关联`book`表,此时`author`表无法创建。

> 2. 创建表`book`时,需要关联`author`表,此时`book`表无法创建。

>

因此创建多多关系表时,需要两外创建一张关系表,用于存放两张表的关系

```sql

create table author(

id int primary key auto_increment,

name varchar(10),

age int

);

-- 创建book表

create table book(

id int primary key auto_increment,

book_name varchar(20),

price float

);

--- 创建book和author关系表

create table book2author(

id int primary key auto_increment,

book_id int,

author_id int,

foreign key(book_id) references book(id)

on update cascade -- 同步更新

on delete cascade, -- 同步删除

foreign key(author_id) references author(id)

on update cascade -- 同步更新

on delete cascade -- 同步删除

);

```

> 1. 数据表之间不存在关系

> 2. 它们之间的关系由第三张表体现

> 3. 操作数据,受到影响的只是对三张表(关系表)

### 2.2.3 一对一

对于一张有很多字段的表,通常都会将表拆分为多个表.

> **好处**

> 1. 查询时,不用一次性的查询出全部的信息;节省数据传输时间

> 2. 可以更好的包含用户的数据安全

对于用户表,会有各种各样的字段信息。通常将表拆分两个表,一张表存放用户的基本信息,另一张表存放用户的详细信息.

```sql

-- 创建用户详情表

create table user_details(

id int primary key auto_increment,

age int,

gender enum("male, female")

);

-- 创建用户表

create table user(

id int primary key auto_increment,

name varchar(20),

user_detail_id int unique,

foreign key(user_detail_id) references user_details(id)

on update cascade -- 同步更新

on delete cascade -- 同步删除

);

```

> 1. 一对一关系的表的外键字段,通常建立在**查询频率最高的表中**

> 2. 一对一关系的表的关键字段通常需要给 **唯一约束** .

# 三、表结构修改

1. 修改表名

```sql

alter table old_tb_name rename to new_tb_name;

```

2. 添加字段

```sql

alter table tb_name add 字段名 字段类型(宽度) 约束条件;

alter table tb_name add 字段名 字段类型(宽度) 约束条件 first;

alter table tb_name add 字段名 字段类型(宽度) 约束条件 after 字符名;

```

3. 删除字段

```sql

alter table tb_name drop 字段名

```

4. 修改字段

```sql

alter table tb_name modify 字段名 字段类型(宽度) 约束条件;

alter table tb_name change 旧字段名 新字段名 新字段类型(宽度) 约束条件;

```

# 四、复制表

`sql`语句查询的结果也是一张表, 从旧表复制数据给新表

```sql

create table new_table_name select * from old_table_name;

```

> 1. 不能复制主键,外键,索引

> 2. 只能复制表结构和数据

```sql

create table new_table_name select * from od_table_name where ...;

```

> 如果后面的条件没有对应数据,也会创建表出来

一键复制

编辑

Web IDE

原始数据

按行查看

历史

mysql 一对多约束条件_MySQL数据库/约束条件与表关系.md · 静谧之裳/python-learn - Gitee.com...相关推荐

  1. mysql显示表已存在_MySQL数据库与数据表的相关操作

    数据库相关操作: 显示数据库:show databases; 如果是0.00秒并不代表没有花费时间,而是时间非常短,小于0.01秒. 创建数据库: Query OK表示创建成功,1行受到影响,处理时间 ...

  2. mysql关键字使用顺序_MySQL数据库之单表查询中关键字的执行顺序

    MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from where group by having order by limit 2 执行顺序 from ...

  3. 如何查看mysql备份的情况_MySQL数据库备份详解(示例代码)

    原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...

  4. mysql下备份所有的数据库和数据表

    shell脚本实现 mysql下备份所有的数据库和数据表 要求:(1)mysql下的数据库的表要以table_name.sql备份保存 (2)保存在当前目录下,并以当天时间命名 #!/bin/bash ...

  5. mysql设置外键并一键生成数据表关系图

    文章目录 1.概念 2.理解 3.添加外键时需要注意的规则 4.navicat for mysql中设置外键 5.数据表关系图的创建 1.概念 主键是能确定一条记录的唯一标识. 外键用于与另一张表的关 ...

  6. mysql的crud语句_MySQL数据库CRUD语句快速入门

    本文目录: Day11 SQL语句 sql语句,一种用于操作数据库的语言 数据库, 简单地理解为硬盘上的文件, 可以存放数据 sql 语句大致可以分类两大类 进入数据库的方法: 1. 命令行代码: 进 ...

  7. mysql数据库表添加字段_mysql数据库怎么给表增加一个字段?

    mysql数据库给表增加一个字段的方法:可以使用"ALTER TABLE"语句来增加一个字段,语法格式"ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条 ...

  8. mysql查询添加数据库表_MySQL数据库篇之表的增删改查

    主要内容: 一.表介绍 二.创建表 三.查看表结构 四.修改表结构 五.复制表 六.删除表 1️⃣ 表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称 ...

  9. mysql 导出中间 数据_MYSQL数据库之间的数据导出与导入

    源数据库地址: 172.16.1.7 目标数据库地址: 172.16.1.51 步骤: (1) 进入172.16.1.7服务器,登录mysql数据库 mysqldump -uusername -ppa ...

  10. mysql实训报告_mysql数据库技术》实验报告.doc

    mysql数据库技术>实验报告 MySQL数据库技术实验报告 系 别 班 级 学 号 姓 名 地点 地点机房 课程名称 MySQL数据库技术 实验名称 实验1 MySQL的使用 实 验 过 程 ...

最新文章

  1. Laravel-5.1验证码mews captcha
  2. 全球及中国实心轴编码器行业前景趋势与运营动向分析报告2022版
  3. Java解析XMl文件之SAX和DOm方法
  4. C语言基础之数据结构
  5. 快速开发系统之前台页面 ---- NO1----登录页面
  6. 如何打开linux内核选项APIC选项,非标准BIOS启动裁减后的Linux内核的一些问题?
  7. 最好用16进制工具wxHexEditor
  8. 【CF1355E】Restorer Distance(整数三分)--附整数/浮点三分模板
  9. 利用js实现文件上传
  10. 博途v14电脑要求_博途V14或者V15,大家现在用的电脑-工业支持中心-西门子中国...
  11. 【数学建模】因子分析
  12. Docker 数据存放位置
  13. 【51nod-1521】一维战舰
  14. Android 集成腾讯播放器sdk(支持多格式,直播,m3u8等)重点是免费
  15. CST软件多少钱一套呢?CST正版软件报价
  16. CAD梦想画图中的“镜像命令”
  17. Keras Tuner官方教程
  18. PoE供电交换机的四种连接方式
  19. Vitalik:为何需要区块链投票?
  20. oracle数据库添加空间不足,oracle数据库解决磁盘空间不足问题

热门文章

  1. Java的继承和python的继承_Java ,python面向对象的继承及其区别
  2. jso java_Javaweb学习之JSON使用
  3. linux中删除用户显示已登录,linux下用户及用户组:查看,新增,删除
  4. table里面用三目_三个方法快速找到SAP后台Table
  5. android最新图表框架,Android中绘制图表的开源框架AChartEngine初识
  6. Java进阶:SpringMVC中通过监听器将Spring上下文对象放置到servletContext中,方便其他地方使用
  7. Echarts数据动态加载的实现样例
  8. 论文笔记_S2D.42_2018-CRV_为经典图像处理辩护:在CPU上的快速深度补全
  9. 二叉树学习之二叉树的构建及操作
  10. 多GPU环境运行实验的一点经验