Mysql中的约束(常见约束、外键约束)

约束的定义

约束就是对于数据库的表中字段,在某些性质上进行约束,以规范化字段或者实现一些功能。

常见的约束

首先我们先创建一个用于存储员工和所对应公司的数据库。

mysql> create database employee_company;
Query OK, 1 row affected (0.01 sec)
mysql> use employee_company;
Database changed

创建公司的table

mysql> create table company(-> Id int primary key auto_increment unique,--公司的id作为主键(primary key),--是公司的唯一标识,并且子自增(auto_increment),--唯一(unique)。-> name varchar(30) not null,--公司名称不能为空(not null)。-> catagory varchar(30) not null default '私企');--公司类型不能为空(not null),--默认是私企(default '私企')。
Query OK, 0 rows affected (0.04 sec)mysql> desc company;--表创建成功
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| Id       | int         | NO   | PRI | NULL    | auto_increment |
| name     | varchar(30) | NO   |     | NULL    |                |
| catagory | varchar(30) | NO   |     | 私企    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

如果想在已经创建好的table上修改字段的类型或者约束可以如下操作,将name字段改成varchar(50)并且唯一。
语法:alter table 表名称 modify 字段名 新类型 新约束;

mysql> alter table company modify name varchar(50) unique;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> desc company;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| Id       | int         | NO   | PRI | NULL    | auto_increment |
| name     | varchar(50) | YES  | UNI | NULL    |                |
| catagory | varchar(30) | NO   |     | 私企    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

再往公司table中加入数据

mysql> insert into company values(1,'腾讯','互联网企业'),(2,'国家电网','国企'),(3,'中电十四所','研究所');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> select * from company;
+----+------------+------------+
| Id | name       | catagory   |
+----+------------+------------+
|  1 | 腾讯       | 互联网企业 |
|  2 | 国家电网   | 国企       |
|  3 | 中电十四所 | 研究所     |
+----+------------+------------+
3 rows in set (0.01 sec)

外键约束

创建员工table,并与公司table中的Id字段相关联
关联的语法格式为:
constrain 外键名称 foreign key(作为外键的字段) references 主表(主表字段));
作为另一个表的外键的这个字段不一定是主键,但必须具有唯一性,并且不能为空,还要和关联字段的类型一致。

mysql> create table employee(-> Id int primary key auto_increment,-> name varchar(50) not null,-> gender varchar(10),-> com_Id int,-> constraint fk_com_emp foreign key(com_Id) references company(Id));--com_Id字段作为外键关联到company(Id)
Query OK, 0 rows affected (0.03 sec)mysql> desc employee;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| Id     | int         | NO   | PRI | NULL    | auto_increment |
| name   | varchar(50) | NO   |     | NULL    |                |
| gender | varchar(10)  | YES  |     | NULL    |                |
| com_Id | int         | YES  | MUL | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

向employee中插入数值

mysql> delete from employee where name = '张三';
Query OK, 1 row affected (0.01 sec)mysql> insert into employee values(1,'张三','男',1);
Query OK, 1 row affected (0.01 sec)mysql> insert into employee values(2,'李四','男',1);
Query OK, 1 row affected (0.01 sec)mysql> insert into employee values(3,'王二麻子','女',3);
Query OK, 1 row affected (0.01 sec)mysql> insert into employee values(4,'路人甲','女',2);
Query OK, 1 row affected (0.01 sec)mysql> select * from employee;
+----+----------+--------+--------+
| Id | name     | gender | com_Id |
+----+----------+--------+--------+
|  1 | 张三     ||      1 |
|  2 | 李四     ||      1 |
|  3 | 王二麻子 ||      3 |
|  4 | 路人甲   ||      2 |
+----+----------+--------+--------+
4 rows in set (0.00 sec)

外键约束

此时删除employee中的一条数据
是可以成功删除的

mysql> delete from employee where id=1;
Query OK, 1 row affected (0.01 sec)mysql> select * from employee;
+----+----------+--------+--------+
| Id | name     | gender | com_Id |
+----+----------+--------+--------+
|  2 | 李四     ||      1 |
|  3 | 王二麻子 ||      3 |
|  4 | 路人甲   ||      2 |
+----+----------+--------+--------+
3 rows in set (0.00 sec)

但是再尝试删除employee中的一条数据
就会报错:不能删除或更新父表的行:外键约束失败 ,说明关联了从表的主表中的字段是不能删除的。

mysql> delete from company where name = '腾讯';
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`employee_company`.`employee`, CONSTRAINT `fk_com_emp` FOREIGN KEY (`com_Id`) REFERENCES `company` (`Id`))

通过多表查询查出两个关联表构成的一个整体的表

mysql> select * from company,employee where employee.com_Id = company.Id;
+----+------------+------------+----+----------+--------+--------+------+
| Id | name       | catagory   | Id | name     | gender | com_Id | age  |
+----+------------+------------+----+----------+--------+--------+------+
|  1 | 腾讯       | 互联网企业 |  2 | 李四     ||      1 | NULL |
|  2 | 国家电网   | 国企       |  4 | 路人甲   ||      2 | NULL |
|  3 | 中电十四所 | 研究所     |  3 | 王二麻子 ||      3 | NULL |
+----+------------+------------+----+----------+--------+--------+------+

限制字段的范围

语法格式:
alter table 表名 add constraint modify check(字段名称 in(可选的值1,可选的值2,…));
如:限制性别选项

mysql> alter table employee add constraint check(gender in('男','女'));
Query OK, 3 rows affected (0.07 sec)
Records: 3  Duplicates: 0  Warnings: 0

当然也可以限制int类型数值的区间,比如年龄

mysql> alter table employee add age int;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> alter table employee add constraint check(age between 20 and 65);
Query OK, 3 rows affected (0.07 sec)
Records: 3  Duplicates: 0  Warnings: 0

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

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

相关文章

【开源可视化报表设计器】借力实现高效率流程化办公!

进行数字化转型、实现流程化办公,这些应该是目前很多企业都想要实现的目标吧。那么,利用什么样的软件平台可以实现?低代码技术平台拥有可视化界面、灵活操作、好维护等众多优势特点,可以借助低代码技术平台、开源可视化报表设计器…

游戏缺失steam_api64.dll的修复方法,快速解决游戏启动问题

在现代科技发展的时代,电脑已经成为我们生活中不可或缺的一部分。然而,在使用电脑的过程中,我们经常会遇到一些常见的问题,其中之一就是找不到某个特定的动态链接库文件,比如steamapi64.dll。这个问题可能会导致某些应…

深度学习中的优化算法二(Pytorch 19)

一 梯度下降 尽管梯度下降(gradient descent)很少直接用于深度学习,但了解它是理解下一节 随机梯度下降算法 的关键。例如,由于学习率过大,优化问题可能会发散,这种现象早已在梯度下降中出现。同样地&…

民国漫画杂志《时代漫画》第25期.PDF

时代漫画25.PDF: https://url03.ctfile.com/f/1779803-1248635084-fd4794?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

03:PostgreSQL逻辑结构(表空间、数据库、模式、表、索引)

环境规划&#xff1a; 操作系统&#xff1a;CentOS 7.9 64bitPostgreSQL 版本&#xff1a;16.x 或 15.x安装用户&#xff1a;postgres软件安装目标路径&#xff1a;/usr/pgsql-<version>数据库数据目录&#xff1a;/pgdata 目录 表空间Tablespace 默认表空间 手动创建…

RBAC 动态权限

文章目录 前言一、RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的访问控制&#xff09;二、Java实现RBAC 权限的大概思路1. 添加依赖2. 配置MyBatis-Plus和数据源1. 添加依赖2. 实体类与Mapper接口UserMapper.java 3. 配置MyBatis-Plus4. 自定义UserDetails…

民国漫画杂志《时代漫画》第15期.PDF

时代漫画15.PDF: https://url03.ctfile.com/f/1779803-1247458444-8befd8?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

【LeetCode:2769. 找出最大的可达成数字 + 模拟】

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

Nodejs(文件操作,构建服务器,express,npm)

文章目录 文件操作1.读取文件1&#xff09;步骤2&#xff09;范例 2.写文件1&#xff09;步骤2&#xff09;范例 3.删除文件4.重命名文件夹5删除文件夹 Url1.url.parse()2.url.fomat() Query1.query.parse()2.query.stringfy()3.编码和解码 第三方模块1.nodemailer2.body-parse…

BUUCTF-Misc24

从娃娃抓起1 1.打开附件 是两个文本文件 2.电报码 电报码在线翻译网站&#xff1a;https://usetoolbar.com/convert/cccn.html 3.汉字五笔编码 汉字五笔编码在线网站查询&#xff1a;https://www.qqxiuzi.cn/bianma/wubi.php 4.转化为MD5值 将文字保存到文本文档 用winR输入…

部署ELK日志分析系统——超详细

ELK日志分析系统 文章目录 ELK日志分析系统资源列表基础环境一、环境准备二、部署Elasticsearch软件2.1、安装Elasticsearch软件2.2、加载系统服务2.3、更改Elasticsearch主配置文件2.4、创建数据存放路径并授权2.5、启动Elasticsearch2.6、查看节点信息 三、安装Elasticsearch…

PDF转word 免费软件推荐

超级PDF 免费的 PDF转Word|在线免费PDF转Word - 超级PDF 知乎推荐&#xff0c;还没试用&#xff1a; https://zhuanlan.zhihu.com/p/614750512?utm_id0

【WEEK13】 【DAY5】Shiro第五部分【中文版】

2024.5.24 Friday 接上文【WEEK13】 【DAY4】Shiro第四部分【中文版】 目录 15.7.Shiro请求授权的实现15.7.1.修改ShiroConfig.java15.7.1.1.添加一行验证授权的代码15.7.1.2.重启 15.7.2.修改MyController.java15.7.3.修改ShiroConfig.java15.7.4.重启15.7.5.修改UserRealm.ja…

Jenkins 动态salve简单配置连接 EKS

安装Jenkins helm repo add jenkins https://charts.jenkins.io helm repo update # 当前版本 jenkins-5.1.18.tgz瘦身后的 values.yaml # grep -Ev ^\s*#|^$ values.yaml nameOverride: fullnameOverride: namespaceOverride: clusterZone: "cluster.local" kubern…

C#对文件进行批量重命名或者对某个单独的文件进行改名

目录 一、FolderBrowserDialog 二、OpenFileDialog 三、Path 四、ui设计 五、代码部分 一、FolderBrowserDialog FolderBrowserDialog是一个用于选择文件夹的对话框控件&#xff0c;可以在windows Forms应用程序中使用。使用它可以让用户选择一个文件夹&#xff0c;并返…

Kubernetes 之硬盘持久化和 EmptyDir 与 HostPath 挂载类型

Kubernetes 之硬盘持久化和 EmptyDir 与 HostPath 挂载类型 持久化存储的意义 在 Kubernetes 中部署的应用都是以 Pod 的方式运行的。大部分情况这些 Pod 是无状态的。但是假如我们部署数据库或者需要一个存放关键文件的文件夹的时候&#xff0c;这时候我们就需要存储持久化以…

ShardingSphere如何完成与Spring家族无缝整合的?

系统集成即ShardingSphere 和 Spring 框架的集成。 ShardingSphere 实现两种系统集成机制&#xff1a; 命名空间&#xff08;namespace&#xff09;机制&#xff0c;通过扩展 Spring Schema 来实现与 Spring 框架的集成编写自定义 starter 组件完成与 Spring Boot 的集成 1 …

需求:实现一个可以统计代码的运行时间

需求&#xff1a;有一个做加法计算的函数&#xff0c;要统计执行这个加法函数代码运行了多久 import timedef add(a, b):time.sleep(1)return a bst time.time() add(100, 200) et time.time() print("该函数运行时间为&#xff1a;", et - st) 学了闭包&#x…

文件批量替换

替换yaml文件中的kube-system成ck find . -type f -name "*.yaml" -exec sed -i s/kube-system/ck/g {} \;

实现C++ Stack(顺序栈)

参考QStack&#xff0c;继承自Vector 类声明 template<typename T>class Stack :protected Vector<T>{public:explicit Stack()noexcept;Stack(const Stack&t)noexcept;Stack(Stack&&t)noexcept;Stack& operator (const Stack& t)noexcept;S…