【数据库】MySQL数据约束和表关系详解

news2024/12/26 0:22:38

目录

1.数据库约束

1.1约束类型

1.2NULL约束

1.3UNIQUE:唯一约束

1.4DEFAULT:默认值约束

1.5PRIMARY:主键约束

1.6FOREIGH KEY:外键约束

2.表的关系

2.1一对一

2.2一对多

2.3多对多


1.数据库约束

数据库中的数据保存在数据表中,在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,比如:数据类型和约束。

约束的概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

作用:保证数据库中数据的正确、有效性和完整性。

注意约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束

1.1约束类型

约束类型解释
NOT NULL指示某列不能存储null值
UNIQUE保证某列的每行必须有唯一的值
DEFAULT规定没有给列赋值时的默认值
PRIMARY KEYNOT NULL和UNIQUE的结合,确保某列有唯一标识,有助于更快速的找到表中的一个特定记录
FOREIGN KEY保证一个表中的数据匹配另一个表中的值的参照完整性
CHECK保证列中的值符合指定的条件

1.2NULL约束

null约束在创建表时,可以指定某列不为空。

例如:创建student表时,指定id不为空。

-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
create table student(
	id int not null,
    sn int unique,
    name varchar(20) default 'no name'
    );

插入一条id为null的语句,可以看到错误提醒。

insert into student(id,sn,name)values(null,1,'星星');

1.3UNIQUE:唯一约束

设置了 UNIQUE 约束的字段,每条记录的值都必须是唯一的,因此 UNIQUE 约束可以防止两条记录在某个字段上出现重复值。

例如:创建student表时,指定sn为唯一约束

create table student(
	id int not null,
    sn int unique,
    name varchar(20) default 'no name'
    );

此时表中已有两条数据。

再插入一条sn为1的数据,再次新增直接报错。

insert into student values(3,1,'阳阳');

1.4DEFAULT:默认值约束

默认值约束即DEFAULT用于给数据表中的字段指定默认值,即当在表中插入一条新记录时若未给该字段赋值,那么,数据库系统会自动为这个字段插人默认值。

例如:创建student表时,给name一个默认值“no name”。

create table student(
	id int not null,
    sn int unique,
    name varchar(20) default 'no name'
    );

现在插入一条未给name赋值的记录。

insert into student(id,sn)values(3,3);

查看student表,name列为"no name".

1.5PRIMARY:主键约束

MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中尽快的找到某一行。主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。但每个表最多只允许一个主键。主键约束的关键字是primary key,当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

添加单列主键:

语法:

create table 表名(
   ...
   <字段名> <数据类型> primary key 
   ...
)

实现代码如下:

create table student(
	id int primary key,
    sn int unique,
    name varchar(20) default 'no name',
    email varchar(20)
    );

添加多列主键(联合主键):

所谓的联合主键,就是这个主键是由一张表中多个字段组成的。若主键是由多个字段组成时,不能直接在字段名后面声明主键约束。一张表只能有一个主键,联合主键也是一个主键。

语法:

create table 表名(
   ...
   primary key (字段1,字段2,…,字段n)
);

实现代码:

create table emp3( 
  name varchar(20), 
  deptId int, 
  salary double, 
  primary key(name,deptId) 
);

主键约束不仅可以在创建表的同时创建,也可以在修改表时添加,语法格式如下:

create table 表名(
   ...
);
alter table <表名> add primary key(字段列表);

实现代码:

-- 添加单列主键
create table emp4(
  eid int, 
  name varchar(20), 
  deptId int, 
  salary double, 
);
alter table emp4 add primary key(eid);
对于整数类型的主键,常配搭自增长auto_increment 来使用。插入数据对应字段不给值时,使用最大值+1.
-- 主键是 NOT NULL 和 UNIQUE 的结合,可以不用 NOT NULL
 id INT PRIMARY KEY auto_increment,

1.6FOREIGH KEY:外键约束

MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。

外键约束的特点:

定义一个外键时,需要遵守下列规则:

1.主表必须已经存在于数据库中,或者是当前正在创建的表。

2.必须为主表定义主键

3.主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这 个外键的内容就是正确的。

创建外键约束:

方法1,在创建表时设置外键约束。

语法:

[constraint <外键名>] foreign key 字段名 [,字段名2,…] references <主表名> 主键列1 [,主键列2,…]

实现代码:

创建课程表(主表)

drop table course;
create table course(
	id int primary key,
    name varchar(20)
    );

创建学生表(从表)

drop table student;
create table student(
	id int primary key,
    name varchar(20) default 'no name',
    age int,
    course_id int,
    foreign key(course_id) references course(id)
    );

方法2,在修改表时设置外键约束。

语法:

alter table <数据表名> add constraint <外键名> foreign key(<列名>) references 
<主表名> (<列名>);

实现代码:

create table course(
	id int primary key,
    name varchar(20)
    );

create table student(
	id int primary key,
    name varchar(20) default 'no name',
    age int,
    course_id int
    );

alter table student add constraint course_id foreign key(course_id) references student (id);

2.表的关系

在数据库中,单表的操作是最简单的。一对一、一对多、多对多是关系型数据库中表与表之间的常见的关联关系

2.1一对一

第一个表中的单个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。

例如:一个人只能对应一个身份证号。

2.2一对多

该关系中第一个表中的单个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关。

例如:一个班级可以有多个学生,班级表中班级号码可以与学生表中多个学生相关,但是学生表中一个学生只能在一个班级。

2.3多对多

该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。

例如:已经有了一个学生表和一个课程表,再添加一个学生课程中间表,即成绩表,在这个表中,存储每一个学生每门课的成绩。

代码:

-- 创建课程学生中间表:考试成绩表
DROP TABLE IF EXISTS score;
CREATE TABLE score (
   id INT PRIMARY KEY auto_increment,
   score DECIMAL(3, 1),
   student_id int,
   course_id int,
   FOREIGN KEY (student_id) REFERENCES student(id),
   FOREIGN KEY (course_id) REFERENCES course(id)
);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库基础篇 《9. 子查询》

目录 1. 需求分析与问题解决 1.1 实际问题 1.2 子查询的基本使用 ​编辑1.3 子查询的分类 分类方式1&#xff1a;我们按内查询的结果返回一条还是多条记录&#xff0c;将子查询分为 单行子查询 、 多行子查询 。 分类方式2&#xff1a; 我们按内查询是否被执行多次&#x…

4WE10D50型力士乐液压阀规格

安装位置 可选择&#xff0c;方向阀最好水平安装&#xff01;对于阀品种&#xff0c;如 &#xff0d; 不带阀芯对中弹簧 &#xff0d; 或带下垂电磁铁 其他安装位置能够导致功能失常或违反有关的技朮规定。 带泄油口的压力开关的安装位置必须选择&#xff0c;使它的泄油口…

Redis源码分析之网络模型

Redis网络模型 阅读源码的初衷Redis源码阅读 阅读源码的初衷 很多网上解释这个Redis为啥这么块&#xff1f;都会说Redis这么快的原因会有一个Redis才用了单线程&使用了多路io复用来检查io事件&#xff0c;单线程可以避免多线程对资源的竞争。如果我们使用了多线程那么就需…

Revit中栏杆扶手、坡道的绘制及插件太多问题

一、在Revit中栏杆与扶手的绘制方法有两种&#xff1a; ①绘制路径 ②放置在主体上 二、执行方式 功能区&#xff1a;“建筑”选项卡“楼梯坡道”面板“栏杆扶手”下拉菜单“绘制路径”。 三、绘制技巧 首先我们一起来看看如何设置栏杆扶手属性。 第一步&#xff1a;设置属…

【vue3学习系列】对比vue2生命周期做了哪些改变,vue3初学者快来看看

文章目录 前言官方生命周期图分析去除beforeCreate与createdsetup代替created其他钩子只是改了名称 剔除vue2后的生命周期图其他钩子函数keepalive错误捕获其他的一些钩子去官方文档看看即可 前言 看了下官方的生命周期的说明&#xff0c;感觉讲的不算太清晰&#xff0c;所以个…

C++ 内联函数(inline)

内联函数&#xff1a;就是在函数前加inline 让函数在调用的地方直接展开 可是内联函数有什么作用呢&#xff1f;&#xff1f; 我们都知道&#xff0c;如果调用一个函数的话&#xff0c;会建立栈帧&#xff0c;在建立栈帧的时候会进行压栈等一系列操作。 而内联函数会在调用的…

Nginx和tomcat反向代理

七层反向代理 实验准备&#xff1a;准备三台虚拟机 192.168.146.20 tomcat&#xff08;两个&#xff09; 192.168.146.30 tomcat 192.168.146.50 七层反向代理&#xff08;nginx&#xff09; 部署虚拟机192.168.146.20&#xff08;两个tomcat已部署完毕&#xff09; …

SwiftUI 4.0(iOS 16)极简实现一个美美哒的多选 Toggle 按钮组

概览 在 SwiftUI 4.0 之前&#xff0c;想要实现如下效果的多选/全选 Toggle 按钮组是要写不少行代码滴&#xff1a; 不过&#xff0c;在 iOS 16 之后我们仅用1行代码即可搞定以上所有&#xff01;在某些场合下这非常有用哦。 在本篇博文中&#xff0c;我们就来看看如何实现它…

2023年的深度学习入门指南(6) - 剪枝和量化

2023年的深度学习入门指南(6) - 剪枝和量化 从这一节开始&#xff0c;我们要准备一些技术专项了。因为目前大模型技术还在快速更新迭代中&#xff0c;各种库和实现每天都在不停出现。因为变化快&#xff0c;所以难免会遇到一些问题。对于细节有一定的把握能力起码可以做到出问…

5.1 数值微分

学习目标&#xff1a; 作为数值分析的基础内容&#xff0c;我建议你可以采取以下步骤来学习数值微分&#xff1a; 掌握微积分基础&#xff1a;数值微分是微积分中的一个分支&#xff0c;需要先掌握微积分基础知识&#xff0c;包括导数、极限、微分等。 学习数值微分的概念和方…

Scillus | 来吧!它可以大大简化你的Seurat分析流程哦!~(二)(高级可视化)

1写在前面 不知道大家那里天气热了没有&#xff0c;苦逼的我虽然“享受”着医院的恒温&#xff0c;但也并没有什么卵用&#xff0c;毕竟我只是个不可以生锈的“小螺丝”。&#x1f972; 上期介绍了Scillus包的基本功能&#xff0c;如何进行数据的预处理及其可视化。&#x1f92…

分享github上比较热门的ChatGPT项目,值得收藏

&#x1f517; 运行环境&#xff1a;chatGPT &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f9…

Elasticsearch painless脚本教程(包含Java API和SpringDataElasticsearch调用脚本)

Elasticsearch painless脚本 1.什么是painless2.painless的特性3.使用kibana进行准备操作3.1 使用kibana创建索引和映射3.2 使用kibana添加测试数据 4.使用painless执行查询操作关于脚本查询须知4.1 字段查询脚本4.1 排序查询脚本 5.如何使用painless执行更新操作关于脚本查询须…

Spring Security 04 自定义认证

登录⽤户数据获取 SecurityContextHolder Spring Security 会将登录⽤户数据保存在 Session 中。但是&#xff0c;为了使⽤⽅便, Spring Security 在此基础上还做了⼀些改进&#xff0c;其中最主要的⼀个变化就是线程绑定。当⽤户登录成功后,Spring Security 会将登录成功的⽤户…

Node内置模块 【crypto加密模块】

文章目录 &#x1f31f;前言&#x1f31f;crypto加密模块&#x1f31f;Crypto模块介绍&#x1f31f;Hash算法&#x1f31f;Hash算法介绍&#x1f31f;Hash算法之MD5&#x1f31f;算法简介&#x1f31f;MD5加密使用 &#x1f31f;Hash算法之SHA1&#x1f31f;算法简介&#x1f3…

二叉树经典题题解

目录 &#x1f345;1.单值二叉树&#x1f345; &#x1f349; 2.相同的树&#x1f349; &#x1f34a;3.对称二叉树&#x1f34a; &#x1f34e;4.另一颗树的子树&#x1f34e; &#x1f34f;5.翻转二叉树&#x1f34f; &#x1f351;6.平衡二叉树&#x1f351; &#x1f3…

【LeetCode: 1027. 最长等差数列 | 暴力递归=>记忆化搜索=>动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

SHELL的脚本编辑与运行

目录 1.编写脚本for1.sh,使用for循环创建20账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用户输入&#xff0c;例如&#xff1a;test1、test2、test3、、test10 a.编辑脚本 b.运行脚本 c.进行检验 2.编写脚本for2.sh,使用for循环&#xff0c;通过…

如何把aac转化为mp3,4个处理方法教给你

一般情况下&#xff0c;将 AAC 文件转换为 MP3 文件有以下几种情况&#xff1a;设备不兼容&#xff1a;AAC 格式通常用于苹果设备上。如果您想在其他设备上播放音频文件&#xff0c;如 Android 手机、MP3 播放器等&#xff0c;就需要将其转换为 MP3 格式。需要更好的兼容性&…

机器学习(七):基于多项式贝叶斯对蘑菇毒性分类预测分析

系列文章目录 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&#x1f4d2;关注…