MySQL示例讲解数据库约束以及表的设计


Posted in MySQL onJune 16, 2022

数据库约束

not null

指定某列的存储不能为null值

create table student (id int not null,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

unique

保证某列必须有唯一的值,插入重复的值就会报错

default

规定给列赋值时的默认值

create table student(id int,name varchar(20) default '匿名');

primary key 主键

主键约束,是not null 与unique的结合,确保某列的赋值不能为null,并且是唯一的

auto_increment 自增特点:

1.如果表中没有记录,自增从1开始

2.如果有数据,从上一条记录往下自增

3.插入再删掉数据,自增的值不会重复利用,会按删掉的那条开始自增

create table student (id int primary key auto_increment,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> insert into student values(null,'张三');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
+----+--------+
1 row in set (0.00 sec)

foreign key 外键

外键约束,在表一中的数据必须在表二中存在,要参照完整性准则

外键约束描述的是两张表的两个列之间的“依赖关系”

外键约束会影响表的删除,例如下面的实例的class表被关联,所以它不能被轻易删除

mysql> create table class (
    -> id int primary key,
    -> name varchar(20) not null
    -> );
Query OK, 0 rows affected (0.04 sec)
mysql> create table student (
    -> id int primary key,
    -> name varchar(20) not null,
    -> email varchar(20) default 'unknow',
    -> QQ varchar(20) unique,
    -> classId int , foreign key (classId) references class(id)
    -> );
Query OK, 0 rows affected (0.03 sec)
mysql> desc class;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)

mysql> desc student;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   | PRI | NULL    |       |
| name    | varchar(20) | NO   |     | NULL    |       |
| email   | varchar(20) | YES  |     | unknow  |       |
| QQ      | varchar(20) | YES  | UNI | NULL    |       |
| classId | int(11)     | YES  | MUL | NULL    |       |
+---------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

check

指定一个条件,通过条件来对值进行判定

但是mysql并不支持

create table test_user (
   id int,
   name varchar(20),
   sex varchar(1),
   check (sex ='男' or sex='女')
);

表的设计

一对一

一对一设计表就比如学生表和账户表,一个账户对应到一个学生,一个学生也只有一个账户

表示方法

1.可以把这两个实体用一张表来表示

2.可以用两张表来表示,其中一张表包含了另一个表的id

一对多

一个学生应该处于一个班级中,一个班级可以包含多个学生

表示方法:

1.在班级表中,新增一列,表示这个班级里的学生id都有啥(mysql没有数组类型,redis可以)

2.班级表不变,学生表中,新增一列classId

多对多

多对多设计表就好比学生表和课程表,一个学生可以选多个课程,一个课程也可以被多个学生选择

表示方法 :

使用一个关联表,来表示两个实体之间的关系

多对多建表实例

-- 学生表
mysql> create table test_student (
    -> id int primary key,
    -> name varchar(10) default 'unknow'
    -> );
Query OK, 0 rows affected (0.03 sec)
-- 选课表
mysql> create table test_course (
    -> id int primary key,
    -> name varchar(20) default 'unknow'
    -> );
Query OK, 0 rows affected (0.02 sec)
-- 成绩表
mysql> create table test_score (
    -> studentId int,
    -> courseId int,
    -> score int,
    -> foreign key (studentId) references test_student(id),
    -> foreign key (courseId) references test_course(id)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> desc test_student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(10) | YES  |     | unknow  |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> desc test_coures;
ERROR 1146 (42S02): Table 'java_5_27.test_coures' doesn't exist
mysql> desc test_course;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | unknow  |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> desc test_score;
+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| studentId | int(11) | YES  | MUL | NULL    |       |
| courseId  | int(11) | YES  | MUL | NULL    |       |
| score     | int(11) | YES  |     | NULL    |       |
+-----------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)

插入数据到实例实现多对多

mysql> insert into test_student values (1, 'listen');
Query OK, 1 row affected (0.01 sec)

mysql> insert into test_course values (1, '数学');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_student values (2, 'Faker');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_course values (2, '数学');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_score values(1, 1, 90);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_score values (1, 2, 99);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_score values (2, 1, 50);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_score values (2, 2, 60);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test_student;
+----+--------+
| id | name   |
+----+--------+
|  1 | listen |
|  2 | Faker  |
+----+--------+
2 rows in set (0.00 sec)

mysql> select * from test_course;
+----+--------+
| id | name   |
+----+--------+
|  1 | 数学   |
|  2 | 语文   |
+----+--------+
2 rows in set (0.00 sec)

mysql> select * from test_score;
+-----------+----------+-------+
| studentId | courseId | score |
+-----------+----------+-------+
|         1 |        1 |    90 |
|         1 |        2 |    99 |
|         2 |        1 |    50 |
|         2 |        2 |    60 |
+-----------+----------+-------+
4 rows in set (0.00 sec)

到此这篇关于MySQL示例讲解数据库约束以及表的设计的文章就介绍到这了,更多相关MySQL数据库约束内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL慢查询的坑
Apr 28 MySQL
简单了解 MySQL 中相关的锁
May 25 MySQL
MySQL Router实现MySQL的读写分离的方法
May 27 MySQL
如何自己动手写SQL执行引擎
Jun 02 MySQL
MySQL8.0无法启动3534的解决方法
Jun 03 MySQL
MySQL命令无法输入中文问题的解决方式
Aug 30 MySQL
MySQL表类型 存储引擎 的选择
Nov 11 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
MySQL优化之慢日志查询
Jun 10 MySQL
mysql幻读详解实例以及解决办法
Jun 16 #MySQL
mysql数据库隔离级别详解
Jun 16 #MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 #MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 #MySQL
MySQL数据库之存储过程 procedure
Jun 16 #MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 #MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 #MySQL
You might like
mysqli_set_charset和SET NAMES使用抉择及优劣分析
2013/01/13 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
PHP实现数组和对象的相互转换操作示例
2019/03/20 PHP
javascript dom 操作详解 js加强
2009/07/13 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
javascript每日必学之封装
2016/02/23 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
2016/03/25 Javascript
Bootstrap实现下拉菜单多级联动
2017/11/23 Javascript
vue中动态添加class类名的方法
2018/09/05 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
javascript头像上传代码实例
2019/09/28 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
Python Tkinter GUI编程入门介绍
2015/03/10 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
使用Python生成XML的方法实例
2017/03/21 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
Python 防止死锁的方法
2020/07/29 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
交通事故赔偿协议书范本
2014/04/15 职场文书
面试自我介绍演讲稿
2014/04/29 职场文书
个人总结格式范文
2015/03/09 职场文书
百家讲坛观后感
2015/06/12 职场文书
趣味运动会通讯稿
2015/07/18 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android