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 28 MySQL
详解Mysql和Oracle之间的误区
May 18 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
MySQL 服务和数据库管理
Nov 11 MySQL
MySQL Server层四个日志的实现
Mar 31 MySQL
MySQL表锁、行锁、排它锁及共享锁的使用详解
Apr 02 MySQL
MySQL磁盘碎片整理实例演示
Apr 03 MySQL
MySQL GTID复制的具体使用
May 20 MySQL
MySQL慢查询中的commit慢和binlog中慢事务的区别
Jun 16 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 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
php基础学习之变量的使用
2011/06/09 PHP
round robin权重轮循算法php实现代码
2016/05/28 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
js动态创建、删除表格示例代码
2013/08/07 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
JS 实现获取验证码 倒计时功能
2018/10/29 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
详解Python当中的字符串和编码
2015/04/25 Python
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
python 同时运行多个程序的实例
2019/01/07 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
Wiggle中国:英国骑行、跑步、游泳 & 铁三运动装备专卖网店
2016/08/02 全球购物
J2EE面试题集锦(附答案)
2013/08/16 面试题
电子商务个人自荐信
2013/12/12 职场文书
机械制造专业个人的自我评价
2013/12/28 职场文书
物业公司采购员岗位职责
2013/12/31 职场文书
运动会入场解说词300字
2014/01/25 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
委托培训协议书
2014/11/17 职场文书
旷工辞退通知书
2015/04/17 职场文书
党员证明信
2015/06/19 职场文书
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
2022/04/06 Python
微信小程序APP的生命周期及页面的生命周期
2022/04/19 Javascript
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL