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 相关文章推荐
为什么代码规范要求SQL语句不要过多的join
Jun 23 MySQL
mysql 直接拷贝data 目录下文件还原数据的实现
Jul 25 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
Mysql 8.x 创建用户以及授予权限的操作记录
Apr 18 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
MySQL选择合适的备份策略和备份工具
Jun 01 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
Jul 07 MySQL
MySql按时,天,周,月进行数据统计
Aug 14 MySQL
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
May 08 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
关于UEditor编辑器远程图片上传失败的解决办法
2012/08/31 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
PHP实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
给Function做的OOP扩展
2009/05/07 Javascript
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
2014/05/16 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
2017/01/18 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
vue + element-ui实现简洁的导入导出功能
2017/12/22 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
2013/12/08 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
META-INF文件夹中的MANIFEST.MF的作用
2016/06/21 面试题
办理信用卡工作证明
2014/01/11 职场文书
浪费资源的建议书
2014/03/12 职场文书
安全生产管理责任书
2014/04/16 职场文书
服务承诺书怎么写
2014/05/24 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
辞职信范文大全
2015/03/02 职场文书
2015初中团委工作总结
2015/07/28 职场文书
高中开学感言
2015/08/01 职场文书
图书借阅制度范本
2015/08/06 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang