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在项目中怎么选事务隔离级别
May 25 MySQL
Mysql效率优化定位较低sql的两种方式
May 26 MySQL
MySQL注入基础练习
May 30 MySQL
mysql连接查询中and与where的区别浅析
Jul 01 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
MySQL高级进阶sql语句总结大全
Mar 16 MySQL
MySQL日期时间函数知识汇总
Mar 17 MySQL
MySQL数据库安装方法与图形化管理工具介绍
May 30 MySQL
mysql数据库实现设置字段长度
Jun 10 MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
Jun 14 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
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
2014/11/20 PHP
php array_merge函数使用需要注意的一个问题
2015/03/30 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
PHP设计模式之命令模式示例详解
2020/12/20 PHP
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
javascript Prototype 对象扩展
2009/05/15 Javascript
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
Javascript中的this绑定介绍
2011/09/22 Javascript
js 控制下拉菜单刷新的方法
2013/03/03 Javascript
在AngularJS中使用jQuery的zTree插件的方法
2016/04/21 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
JS实现炫酷轮播图
2020/11/15 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
Python最长公共子串算法实例
2015/03/07 Python
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
简介Django中内置的一些中间件
2015/07/24 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
python使用pil库实现图片合成实例代码
2018/01/20 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
Unix里面如何在后台运行程序
2016/10/14 面试题
2014全国两会心得体会
2014/03/17 职场文书
2014基层党员批评与自我批评范文
2014/09/24 职场文书
齐云山导游词
2015/02/06 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
工作会议简报
2015/07/20 职场文书
《观潮》教学反思
2016/02/17 职场文书