MySQL约束(创建表时的各种条件说明)


Posted in MySQL onJune 21, 2022

由于增删改了emp表中的记录,因此这里重新创建了一个脚本并使用

create database bjpowernnode;
use bjpowernode;
source C:\Users\Administrator\Desktop\bjpowernode.sql;

约束

1.什么是约束?

  • 约束就是表中的限制条件
  • 约束的关键字是:constraint

2. 约束的分类

  • 非空约束     not null
  • 唯一性约束   unique
  • 主键约束     primary key
  • 外键约束     foreign key
  • 检查约束     MySQL数据库不支持,Oracle数据库支持

1. not null(非空约束)

not null约束的字段,不能为null值,必须给具体的数据

创建表,给字段添加 非空约束【用户的邮箱地址不能为空】

drop table if exists t_user;
create table t_user(
        id int(10),
        name varchar(32) not null,
        email varchar (32)
);

MySQL约束(创建表时的各种条件说明)

MySQL约束(创建表时的各种条件说明)

2. unique(唯一性约束)

创建表,保证邮箱地址唯一

create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128) unique
);

MySQL约束(创建表时的各种条件说明)

unique约束的字段不能重复,但是可以为null

MySQL约束(创建表时的各种条件说明)

以上的约束属于列级约束

表级约束:

 create table t_user(
     id int(10),
     name varchar(32),
     email varchar(128),
     unique(email)
 );

 1.使用表级约束给多个字段添加约束

 create table t_user(
     id int(10),
     name varchar(32),
     email varchar(128),
     unique(name,email)
);

2.表级约束可以给约束起名,以后通过这个名字来删除约束

   create table t_user(
       id int(10),
       name varchar(32),
       email varchar(128),
       constraint t_user_email_unique unique(email)
 );

MySQL约束(创建表时的各种条件说明)

MySQL约束(创建表时的各种条件说明)

MySQL约束(创建表时的各种条件说明)

not null 和unique可以联合使用

MySQL约束(创建表时的各种条件说明)

3. primary key (主键约束)

1.主键涉及到的术语:

  • 主键约束
  • 主键字段
  • 主键值

2.以上三者之间的关系:

  • 表中的某个字段添加主键约束之后,该字段称为主键字段
  • 主键字段中出现的每一个数据都被称为主键值

3.给某个字段添加主键约束以后,该字段不能重复,也不能为空

  • 主键约束效果和''not null unique'' 相同,但是本质不同,
  • 主键约束除了可以做到''not null unique''之外
  • 主键字段还会默认添加''索引-index''

4. 一张表应给有主键字段,如果没有,表示这张表是无效的

  • 主键值是当前行数据的唯一标识
  • 主键值是当前行数据的身份证号码
  • 即使表中的两行记录数据是完全相同的,
  • 但是由于主键值不同,就认为这是两行完全不同的字段

5.无论是单一主键还是复合主键,一张表的主键约束只能有一个

  • 给一个字段添加主键约束,被称为单一主键约束
  • 给多个字段联合添加主键约束,被称为复合主键

6.主键根据性质分类:

  • 自然主键:主键值是一个自然数,这个主键和当前的业务没有关系
  • 业务主键:主键值和当前业务紧密相关
  • 当业务发生改变的时候,主键值通成会受到影响,所以业务主键之用很少。

单一主键,列级约束

create table t_user(
    id int(10) primary key,
    name varchar(32)
);

MySQL约束(创建表时的各种条件说明)

单一主键,表极约束

 create table t_user(
     id int(10),
     name varchar(32),
     primary key(id)
);

MySQL约束(创建表时的各种条件说明)

复合主键:只能用表级约束

mysql> create table t_user(
    -> id int(10),
    -> name varchar(32),
    -> primary key(id,name)
    -> );

MySQL约束(创建表时的各种条件说明)

MySQL约束(创建表时的各种条件说明)

auto_increment:主键自增

MySQL数据管理系统中提供了一个自增的数字,专门用来自动生成主键值

主键值不需要用户维护,也不需要用户提供了,自动生成的,

这个自增的数字默认从1开始以1递增:1,2,3,4,....

mysql> create table t_user(
    -> id int(10) primary key auto_increment,
    -> name varchar(32)
    -> );

MySQL约束(创建表时的各种条件说明)

4. foreign key(外键约束)

1.外键约束涉及到的术语:

  • 外键约束
  • 外键值
  • 外键字段

2.以上三者之间的关系:

  • 某个字段添加外键约束以后称为外键字段
  • 外键字段中的每一个数据称为外键值

3.外键分为单一外键和复合外键

  • 单一外键:给一个字段添加外键约束
  • 复合外键:给多个字段添加外键约束

4.一张表中可以有多个外键字段

设计一个数据库表,用来存储学生和班级信息,给出两种解决方案:

学生信息和班级信息之间的关系:一个班级对应多个学生,这是典型的一对多的关系

在多的一方加外键

第一种设计方案:将学生信息和班级信息存储到一张表中

第二种设计方案:将学生信息和班级信息分开两张表存储,学生表+班级表

  • 学生表 t_student
sno(主键约束) sname classno(外键约束)
1 jack 100
2 lucy 100
3 kk 100
4 smith 200
5 frank 300
6 jhh 300
  • 班级表t_calss
cno(主键约束) cname
100 高三1班
200 高三2班
300 高三3班

为了保证t_student 表中的classno字段中的数据必须来自于t_class表中的cno字段中的数据,有必要给t_student表中的classno字段添加外键约束,classno称为外键字段,该字段中的值称为外键值。

注意:

1.外键值可以为空

2.外键字段必须得引用这张表中的主键吗?

  • 外键字段引用一张表的字段的时候,被引用的字段必须具备唯一性
  • 即具有unique约束,不一定非是主键

3.班级表为父表,学生表为子表

  • 应该先创建父表,再创建子表
  • 删除数据时,应该先删除子表中的数据,再删除父表中的数据
  • 插入数据时,应该先插入父表中的数据,再删除子表中的数据

MySQL约束(创建表时的各种条件说明)

DROP TABLE IF EXISTS t_student;
DROP TABLE IF EXISTS t_class;
 
 CREATE TABLE t_class(
 cno INT(3) PRIMARY KEY,
 cname VARCHAR(128) NOT NULL UNIQUE
 );
 
 CREATE TABLE t_student(
 sno INT(3) PRIMARY KEY,
 sname VARCHAR(32) NOT NULL,
 classno INT(3),-- 外键
 CONSTRAINT t_student_class_fk FOREIGN KEY(classno) REFERENCES t_class(cno)
 );
 
 INSERT INTO t_class(cno,cname) VALUES(100,'高三1班');
 INSERT INTO t_class(cno,cname) VALUES(200,'高三2班');
 INSERT INTO t_class(cno,cname) VALUES(300,'高三3班');
 
 INSERT INTO t_student(sno,sname,classno) VALUES(1,'jack',100);
 INSERT INTO t_student(sno,sname,classno) VALUES(2,'lucy',100);
 INSERT INTO t_student(sno,sname,classno) VALUES(3,'hh',100);
 INSERT INTO t_student(sno,sname,classno) VALUES(4,'frank',200); 
 INSERT INTO t_student(sno,sname,classno) VALUES(5,'smith',300);
 INSERT INTO t_student(sno,sname,classno) VALUES(6,'jhh',300);
 
 SELECT * FROM t_student;
 SELECT * FROM t_class;
 
-- 添加失败,因为有外键约束 
 INSERT INTO t_student(sno,sname,classno) VALUES(8,'kk',500);

重点:典型的一对多关系,设计时在多的一方加外键

5. 级联更新与级联删除

在删除父表中的数据的时候,级联删除子表中的数据

在更新父表中的数据的时候,级联更新子表中的数据

以上的级联更新和级联删除谨慎使用,

因为级联操作会使数据数据改变或删除,数据是无价的。

语法:

  • 级联更新:on update cascase
  • 级联删除:on delete cascase

MySQL约束(创建表时的各种条件说明)

MySQL约束(创建表时的各种条件说明)

MySQL中对于有些约束的修改比较麻烦,所以应该先删除约束,再添加约束

删除外键约束:

alter table t_student drop foreign key t_student_class_fk

添加外键约束并级联更新:

alter table t_student add constraint t_student_class_fk foreign key(classno)
references t_class(no) on delete cascade;

添加外键约束并级联删除:

alter table t_student add constraint t_student_class_fk foreign key(classno)
references t_class(no) on update cascade;

级联删除

MySQL约束(创建表时的各种条件说明)

MySQL约束(创建表时的各种条件说明)

级联更新

MySQL约束(创建表时的各种条件说明)

MySQL约束(创建表时的各种条件说明)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。


Tags in this post...

MySQL 相关文章推荐
MySQL表的增删改查基础教程
Apr 07 MySQL
mysql查询的控制语句图文详解
Apr 11 MySQL
简单了解 MySQL 中相关的锁
May 25 MySQL
MySQL 8.0 Online DDL快速加列的相关总结
Jun 02 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
SQL之各种join小结详细讲解
Aug 04 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
MySQL Server 层四个日志
Mar 31 MySQL
Golang连接并操作MySQL
Apr 14 MySQL
MySQL 数据表操作
May 04 MySQL
SQLServer常见数学函数梳理总结
Aug 05 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 #MySQL
MySQL数据库表约束讲解
Jun 21 #MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 #MySQL
MySQL transaction事务安全示例讲解
Jun 21 #MySQL
MySQL详细讲解变量variables的用法
Jun 21 #MySQL
mysql sql常用语句大全
Jun 21 #MySQL
MySQL示例讲解数据库约束以及表的设计
Jun 16 #MySQL
You might like
dedecms中使用php语句指南
2014/11/13 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
详解Yii2.0使用AR联表查询实例
2017/06/16 PHP
javascript 日期时间 转换的方法
2013/02/21 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
浅谈js script标签中的预解析
2016/12/30 Javascript
jQuery表单验证之密码确认
2017/05/22 jQuery
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
python3.5使用tkinter制作记事本
2016/06/20 Python
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
python3爬取各类天气信息
2018/02/24 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
HTML5未来发展趋势
2016/02/01 HTML / CSS
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
自我介绍演讲稿
2014/01/15 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
小学运动会口号
2014/06/07 职场文书
组工干部演讲稿
2014/09/02 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
基于Python和openCV实现图像的全景拼接详细步骤
2021/10/05 Python
css3应用示例:新增的选择器
2022/03/16 HTML / CSS