Author: 老九
个人博客:老九的CSDN博客
?? 个人名言:不可控之事 乐观面对
?? 系列专栏:MySQL通关系列

文章目录

  • 数据库约束
    • not null
    • unique
    • default
    • primary key 主键
      • auto_increment
    • foreign key 外键
    • check
  • 表的设计
    • 一对一
    • 一对多
    • 多对多
      • 多对多建表实例
      • 插入数据到实例实现多对多

数据库约束

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)

————————————————————————
码字不易,大家的支持就是我坚持下去的动力
版权声明:本文为CSDN博主「浦上青天」的原创文章

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

MySQL数据库约束,表的设计相关推荐

  1. MySQL 表的增删改查(进阶篇①)· 数据库约束 · 表的设计 · 新增查询结果 · 聚合查询 · 聚合函数 · group by · having · 笛卡尔积

    一.数据库约束 1.1 约束类型 1.2 非空约束 not null 1.3 唯一约束 unique 1.4 默认约束 default 1.5 主键约束 primary key 1.6 自增主键 pr ...

  2. mysql 外键查询_mysql 外键查询(mysql数据库多表联查)

    mysql 外键查询(mysql数据库多表联查) 2020-07-24 11:51:00 共10个回答 查看方式主要是通过第三方工具或者是sql语句,主要有以下三种方式1:使用Navicateform ...

  3. mysql数据库多表查询(内连接,外连接,自连接,子查询及案例分析)

    mysql数据库多表查询 之前接触的项目或者自己涉及的部分对于多表查询的使用都比较的少,常常是自己更具案例进行学习,最近见到的比较的多,所以今天就好好的总结一下,为下一步学习做准备! 1.多表查询关系 ...

  4. 为什么说mysql数据库单表最大两千万?依据是啥?

    为什么说mysql数据库单表最大两千万?依据是啥? 前言 数据库单表行数最大多大 索引的结构 页的结构 从页到索引 B+树承载的记录数量 x怎么算 y的计算 行总数计算 行数超一亿就慢了吗? B树承载 ...

  5. R操作MySQL数据库创建表、删除表、增删改查(CRUD)

    R操作MySQL数据库创建表.删除表.增删改查(CRUD) 关系数据中的数据是按照一定范式去存储的.当我们需要非常高级和复杂的Sql查询就可以使用关系数据库的数据资产.不光java和python可以容 ...

  6. Mysql 数据库锁表的原因和解决方法

    Mysql 数据库锁表的原因和解决方法 参考文章: (1)Mysql 数据库锁表的原因和解决方法 (2)https://www.cnblogs.com/xinruyi/p/11108795.html ...

  7. mysql一张表1亿天数据_1亿条数据在PHP中实现Mysql数据库分表100张

    转: 1亿条数据在PHP中实现Mysql数据库分表100张 http://php-z.com/thread-2115-1-1.html (出处: PHP-Z) 当数据量猛增的时候,大家都会选择库表散列 ...

  8. MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效

    问题描述:MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效.MySQL数据库中构建的用户表表结构如下所示: DROP TABLE IF ...

  9. mysql doc插入数据_如何向MySQL数据库的表中录入数据.doc

    如何向MySQL数据库的表中录入数据 当建好了数据库及表时,首先想到的就是向数据库的表中输入数据,这就涉及到如何向数据库录入数据,下面我们就来探讨一下这个问题. 1.常用的方法是使用insert语句( ...

  10. 关于mysql数据库回表的粗浅理解

    1关于mysql数据库回表 说一下现象 比如有有一张test表,设置id为主键,name为索引 当使用 select id,name,age from test where id=1 查询数据的时候, ...

最新文章

  1. Windows 不能在 本地计算机 启动 SQL Server 。错误代码126.
  2. DevExpress的TreeList实现自定义节点NodeCell的背景颜色和前景色
  3. 智能市场变革,独辟蹊径的机器人营销
  4. 关于获取oracle中数据变更的时间戳的探索(待更新)
  5. P2158 [SDOI2008]仪仗队 欧拉函数
  6. android studio: 让项目通过阿里云 maven jcenter 下载依赖资源
  7. 各个刷流量软件总结对比
  8. Linux上查找最大文件的 3 种方法
  9. 人工智能、大数据和云计算之间,它们之间主要有什么关系?
  10. 运动斗士终南山的不老之道
  11. 启动Maven项目 死活报404 配置文件都没问题
  12. 量化交易alpha、beta、shape等基本概念梳理
  13. MSRN:Multi-scale Residual Network for Image Super-Resolution 论文理解
  14. 容器技术-Docker 网络01-默认网络
  15. 云服务器Windows 2012 IIS添加站点绑定域名的方法?
  16. createjs基础入门
  17. java do while用法_Java do-while循环
  18. HTTP请求的交互过程和常见的相应状态码
  19. 针对Android TV端使用的自定义RecyclerView
  20. matlab离散数据微积分

热门文章

  1. 今天,小灰35岁了!
  2. 南京邮电大学CTF题目writeup (二) 含题目地址
  3. 深度聚类方法之对比聚类(Contrastive Clustering,CC)
  4. _bss_start _armboot_start
  5. 【呆鸟译Py】数据分析师进阶必备6大数学利器
  6. 极致CMS1.7 前台SQL注入(CNVD-2021-26000)
  7. 无界面的Chrome浏览器
  8. 区块链招聘报告:平均薪资10.5万美元;伦敦需求最大
  9. 安徽 省二级计算机笔试真题,安徽省计算机二级考试真题access
  10. [ACM]【树形DP/LCA】牛客练习赛62 牛牛染颜色