MySQL数据库,约束

关于约束

数据完整性是指数据的精确性和可靠性。防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或无效信息。

SQL规范以约束的方式对表数据进行额外的条件限制。

约束是表级的强制规定。可以在创建表时规定约束,或者在表创建之后通过对表的修改来规定约束。约束即对表中字段的限制

约束的分类:

角度一:约束的字段的个数

单列约束、多列约束

角度二:约束的作用范围

列级约束、表级约束

列级约束:声明在对应字段的后面。

表级约束:声明在所有字段的后面。

角度三:约束的作用

①非空约束(NOT  NULL)

②唯一性约束(UNIQUE)

③主键约束(PRIMARY  KEY)

④外键约束(FOREIGN  KEY)

⑤检查约束(CHECK)

⑥默认值约束(DEFAULT)

添加约束操作可以在创建表语句(CREATE  TABLE)、修改表语句(ALTER  TABLE)中。

删除约束操作在修改表语句(ALTER  TABLE)中。

查看表约束:

SELECT  *  FROM  information_schema.table_constraints

WHERE  table_name  =  '表名';

非空约束

作用:

限制某个字段/某个列的值不允许为空(NULL)

关键字:NOT  NULL

注:

  • 非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空非空约束只有列级约束,没有表级约束)。

  • 空字符串''不等于NULL

在创建表语句(CREATE  TABLE)添加约束:

例:

CREATE TABLE test_1(id INT NOT NULL,last_name VARCHAR(15) NOT NULL,email VARCHAR(25),sal DECIMAL(10,2));

注:

  • 此时添加记录时,如果id和last_name赋值为NULL,就会报错,添加失败。

  • 当使用INSERT  INTO  表名(字段名,字段名,……) VALUES (字段值,字段值,……); 的方式添加记录时,在表名后的括号中有未指明的字段时,添加的记录的未指明的字段要么默认为默认值,要么没有设置默认值,就会默认为NULL。如果此时未指明的字段没有设置默认值,且有非空约束,就会报错,添加失败

在修改表语句(ALTER  TABLE)中添加约束:

例:在MODIFY语句后写NOT  NULL关键字即可

ALTER TABLE test_1MODIFY email VARCHAR(25) NOT NULL;

在修改表语句(ALTER  TABLE)中删除约束:

例:在MODIFY语句后不写NOT  NULL关键字即可

ALTER TABLE test_1MODIFY email VARCHAR(25);

唯一性约束:

用来约束某个字段/某列的值不能重复。(但是允许出现多个空值)

关键字:UNIQUE

特点:

  • 同一个表可以有多个唯一约束。

  • 唯一约束可以是某一个列的值唯一,也可以是多个列组合的值的唯一

  • 唯一性约束允许列值为空

  • 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同

  • MySQL会给唯一约束的列上默认创建一个唯一索引

添加唯一性约束:

建表时:

CREATE TABLE test_2(id INT UNIQUE NOT NULL,-- 列级约束last_name VARCHAR(15) NOT NULL,email VARCHAR(25) UNIQUE,-- 列级约束sal DECIMAL(10,2),phone_num VARCHAR(15),UNIQUE(phone_num)-- 表级约束);

改表时(ALTER  TABLE):

方式一:使用ADD  UNIQUE(key)的方式。

例:

ALTER test_2AND UNIQUE(sal);

方式二:使用MODIFY的方式。

例:

ALTER TABLE test_2MODIFY last_name VARCHAR(15) UNIQUE;

复合的唯一性约束:(多列约束)

例:

CREATE TABLE test_user(id INT,`name` VARCHAR(15),`password` VARCHAR(25),#表级约束UNIQUE(`name`,`password`));

此时以name和password作为唯一性的整体,即两个记录的name和password都相同时,才违背唯一性

删除唯一性约束:

  • 添加唯一性的约束的列上也会自动创建唯一索引

  • 删除唯一性约束只能通过删除唯一索引的方式删除

  • 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样

  • 如果创建唯一索引时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和组合中第一个列的列名相同也可以自定义约束名

  • 删除使用ALTER  表名  DROP  INDEX  索引名 的方式

例:

ALTER TABLE test_2DROP INDEX last_name;ALTER TABLE test_2DROP INDEX sal;

关于自定义约束名:

在UNIQUE前加上CONSTRAINT  约束名 ,即可。

例:

CREATE TABLE test_4(email VARCHAR(25) CONSTRAINT ema UNIQUE,-- 列级约束phone_num VARCHAR(15),CONSTRAINT pho_num UNIQUE(phone_num)-- 表级约束);

主键约束:

主键约束用来唯一标识表中的一行记录

关键字:PRIMARY  KEY

特点:

  • 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值

  • 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。

  • 主键约束对应着表中的一列或者多列(复合主键)

  • 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复

  • MySQL的主键名是PRIMARY,无法自定义主键约束名

  • 当创建主键约束时,系统默认会在所在的列会列的组合上建立对应的主键索引(能够通过主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束的对应的索引就自动删除了

  • 不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性

添加主键约束

建表时指定主键约束:

例:

CREATE TABLE test_pri(id INT PRIMARY KEY,-- 列级约束last_name VARCHAR(15),salary DECIMAL(10,2),email VARCHAR(25));
CREATE TABLE test_pri_1(id INT,last_name VARCHAR(15),salary DECIMAL(10,2),email VARCHAR(25),PRIMARY KEY(id,email)-- 表级约束);

修改表时添加约束:

ALTER TABLE test_pri_2ADD PRIMARY KEY(id);

删除主键约束:(最好不要删除表中的主键)

ALTER TABLE test_pri_2DROP PRIMARY KEY;

自增列:AUTO_INCREMENT

作用:某个字段的值自增

关键字:AUTO_INCREMENT

特点:

  1. 一个表最多只能有一个自增长列

  2. 当需要产生唯一标识符或顺序值时,可设置自增长。

  3. 子增长列约束的列必须是键列(主键列,唯一键列)

  4. 自增约束的列的数据类型必须是整数类型

  5. 如果自增列指定了0或NULL,不会赋值为0或NULL而是会在当前最大值的基础上自增;如果自增列手动指定了具体值,则直接赋值为具体值且自增列会自动由小到大排序

在创建表时加上AUTO_INCREMENT:

CREATE TABLE test_pri_3(id INT PRIMARY KEY AUTO_INCREMENT,last_name VARCHAR(15),salary DECIMAL(10,2),email VARCHAR(25));

在修改表时加上AUTO_INCREMENT:

ALTER TABLE test_pri_4MODIFY id INT AUTO_INCREMENT;

删除AUTO_INCREMENT:

ALTER TABLE test_pri_4MODIFY id INT;  -- 不写AUTOINCREMENT即可

注:MySQL8.0后将主键的计数器持久化到重做日志中。即,删除了自增列的某个记录(若此自增列的值为a),即使重启了数据库,下一次添加记录时,新的自增列的值还是a + 1。

外键约束:

作用:限定某个表的某个字段的引用完整性

关键字:FOREIGN KEY

关于主表和从表(父表和子表):

主表(父表):被引用的表

从表(子表):引用其他表的表

特点:

  1. 从表的外键列,必须引用/参考主表的主键或唯一约束的列。因为被引用/参考的值必须是唯一的。

  2. 在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名也可以指定外键约束名

  3. 创建表时就指定外键约束的话,先创建主表,再创建从表

  4. 删表时,先删从表(或先删除外键约束),再删除主表

  5. 主表的记录被从表引用时,主表的记录将不允许被删除如果要删除,需要先删除从表中引用该记录的数据,才可以删除主表的数据

  6. 在从表中指定外键约束,并且一个表可以建立多个外键约束

  7. 从表的外键列与主表的被引用的列的名字可以不同,但是数据类型必须一样,逻辑意义一致。

  8. 创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是外键约束名。(使得根据外键的效率很高)

  9. 删除外键约束之后,必须手动删除对应的索引

在创建表时添加外键

先创建主表:

CREATE TABLE test_dept(dept_id INT PRIMARY KEY,dept_name VARCHAR(15));

再创建从表:

CREATE TABLE test_emp(emp_id INT PRIMARY KEY AUTO_INCREMENT,emp_name VARCHAR(15),dept_id INT,CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES test_dept(dept_id));

建立外键约束使用CONSTRAINT 外键约束名 FOREIGN KEY(从表的外键列) REFERENCES 主表(主表的被引用的列)

修改表时添加外键:

ALTER TABLE test_empADD CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES test_dept(dept_id);

即在ADD语句后添加CONSTRAINT 外键约束名 FOREIGN KEY(从表的外键列) REFERENCES 主表(主表的被引用的列)

约束等级:

  • CASCADE方式:在父表上更新/删除记录时,同步更新/删除掉的子表的记录

  • SET NULL方式:在父表上更新/删除记录时,将子表上匹配记录的列设为NULL,但是要注意子表的外键列不能为非空约束

  • NO ACTION方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行更新/删除

  • RESTRICT方式:同No action方式,都是立即检查外键约束。

  • SET DEFAULT方式:父表有变时,子表将外键里了设置成一个默认的值,但INNODB不能识别。

如果没有指定等级,就相当于RESTRICT方式

指定等级在CONSTRAINT 外键约束名 FOREIGN KEY(从表的外键列) REFERENCES 主表(主表的被引用的列) 

的语句后加上ON UPDATE 约束等级 ON DELETE 约束等级 即可。

例:

CREATE TABLE test_emp(emp_id INT PRIMARY KEY AUTO_INCREMENT,emp_name VARCHAR(15),dept_id INT,CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES test_dept(dept_id) ON UPDATE CASCADE ON DELETE SET NULL);

对于外键约束,最好使用ON UPDATE CASCADE ON DELETE RESTRICT的方式。

删除外键约束:

第一步可以使用以下操作来查看某个表的外键约束的外键约束名,再删除外键约束:

SELECT  *  FROM  information_schema.table_constraints

WHERE  table_name  =  '表名';

删除:

第二步查看索引名,再删除索引。(只能手动删除)

SHOW INDEX FROM 表名;

ALTER TABLE 表名

DROP INDEX 索引名;-- 索引名与外键约束名一致。

检查约束:

作用:检查某个字段的值是否符合一定要求,一般指的是值的范围。(MySQL8.0及以上支持,在5.7中不起作用)

关键字:CHECK

建表时使用:

在字段后加上CHECK(条件)

当添加记录时,相应的字段的值需要满足CHECK括号后面的条件才能添加成功,否则报错,添加失败。

例:若员工工资不得低于2000

CREATE TABLE test_check(id INT,last_name VARCHAR(15),salary DECIMAL(10,2) CHECK(salary > 2000));

默认值约束:

作用:给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,就赋值为默认值。

关键字:DEFAULT

建表时添加默认值:

在字段后加上DEFAULT 默认值

例:

CREATE TABLE test_check(id INT,last_name VARCHAR(15),salary DECIMAL(10,2) DEFAULT 2000);

在修改表时添加约束:

ALTER TABLE 表名

MODIFY 字段名 字段类型 DEFAULT 'unknow';

例:

ALTER TABLE test_defaultMODIFY last_name VARCHAR(15) DEFAULT 'unknow';

删除默认值约束:

在修改表时的MODIFY语句中不写DEFAULT即可。

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

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

相关文章

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】SLAM(基础篇)(五)

目录 前言 几个相关概念 双目视惯雷达SLAM 相关工作 系统综述 视觉前端

排序算法---希尔排序

1. 基本思想 希尔排序是插入排序的一种,它与直接插入排序不同的是,它会优先比较距离较远的元素,因此希尔排序又被称为“缩小增量排序”。希尔排序的实现思路是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序&…

​flutter 代码混淆

Flutter 应用混淆:Flutter 应用的混淆非常简单,只需要在构建 release 版应用时结合使用 --obfuscate 和 --split-debug-info 这两个参数即可。–obfuscate --split-debug-info 用来指定输出调试文件的位置,该命令会生成一个符号映射表。目前支…

智能驾驶时代加速到来,爱芯元智成车载芯片界最大黑马?

今年以来,随着新能源汽车厂商们轰轰烈烈的“开城之战”持续上演,国内新能源汽车行业俨然已进入智能驾驶时代。在这场技术革新大潮中,扮演重要角色的除了处于视觉中心风光无两的车企,还有上游诸多的智能驾驶方案供应商。 下游的军…

C 语言USB通信之使用 libusb库

在C语言中,要与USB接口通信,通常需要使用特定的库和API。以下是一些常见的库和API,用于在C语言中与USB接口通信: libusb:这是一个开源的USB库,提供了跨平台的USB设备访问功能。它提供了API,使您…

MS913/914 25-100MHz 10/12 位用于平面显示器链路Ⅲ的具有直流平衡编码和双向控制通道的串化器和解串器

MS913/MS914 芯片组是 25MHz~100MHz 10 位/12 位 FPD Link III SER/DES(串化器/解串器),它提供高速 FPD-Link III 接口和高速正向通路以及用于差分对上数据发送的双向 控制通路。广泛应用于车载摄像,医疗设备,管道探测等领 域。 主要特点…

master分支切换到release分支

commit master分支的代码 glol 查看当前分支的commit id git checkout 2023.12_rel gl git checkout -b 分支名 gcp commit_id(glol) git push --set-upstream origin 分支名

lwIP 细节之六:connected、sent、poll 回调函数是何时调用的

使用 lwIP 协议栈进行 TCP 裸机编程,其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数,注册到协议栈,在适当的时候,由协议栈自动调用,所以称为回调。 注:除非特别说明,以下内…

HarmonyOS4.0从零开始的开发教程11Video组件的使用

HarmonyOS(九)Video组件的使用 概述 在手机、平板或是智慧屏这些终端设备上,媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集,还是视频的播放、切换、循环,亦或是相机的预览、拍照等功能…

OpenCloud os 9上面安装docker docker-compose脚本

#!/bin/bash #opencloudOs上面安装docker docker-compose环境 curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i s/\$releasever/8/g /etc/yum.repos.d/docker-ce.repo wget https://vault.centos.org/ce…

C++异步网络库workflow入门教程(1)HTTP任务

如果觉得小弟写的可以,请给一个点赞关注支持 workFlow c异步网络库编译教程与简介 创建并启动http任务 示例 #include <workflow/WFFacilities.h> int main(){WFHttpTask * httpTask WFTaskFactory::create_http_task("http://baidu.com",0,0,0);protocol:…

Python码上行动系列丛书(由北京大学出版社出版)

前言 Python码上行动系列丛书火热来袭&#x1f4a5;&#x1f4a5;&#x1f4a5; 三册在手&#xff0c;Python全掌握&#xff01;无论是初学者还是进阶玩家&#xff0c;我们都有你想要的&#xff01; 让ChatGPT带你轻松入门Python编程&#xff0c;享受编程带来的乐趣&#xff0…

【数据结构】——二叉树功能

前言&#xff1a;我们前面已经了解了二叉树的一些概念&#xff0c;那么我们今天就来了解下二叉树的遍历实现和一些性质。 二叉树的遍历方式有三种&#xff1a;前序&#xff0c;中序&#xff0c;后序。 前序&#xff1a;先根节点&#xff0c;再左子树&#xff0c;最后右子树。 中…

Linux——MySQL数据库系统()

一、访问MySQL数据库 MySQL数据库系统也是一个典型的C/S(客户端/服务器&#xff09;架构的应用&#xff0c;要访问MySQL数据库需要使用专门的客户端软件。在Linux系统中&#xff0c;最简单、易用的MySQL客户端软件是其自带的mysql命令工具。 1、登录到MySQL服务器经过安装后的初…

Leetcode—783.二叉搜索树节点最小距离【简单】

2023每日刷题&#xff08;五十八&#xff09; Leetcode—783.二叉搜索树节点最小距离 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ void dfs(struct TreeNode* roo…

在接触新的游戏引擎的时候,如何能快速地熟悉并开发出一款新游戏?

引言 大家好&#xff0c;今天分享点个人经验。 有一定编程经验或者游戏开发经验的小伙伴&#xff0c;在接触新的游戏引擎的时候&#xff0c;如何能快速地熟悉并开发出一款新游戏&#xff1f; 利用现成开发框架。 1.什么是开发框架&#xff1f; 开发框架&#xff0c;顾名思…

微信抖音快手QQ小程序 - 预支付接口参数out_trade_no长度限制 - jsapi统一下单接口

报错 微信小程序&#xff1a; {"code":0,"show":1,"msg":"输入源“/body/xml/out_trade_no”映射到值字段“商户订单号”字符串规则校验失败&#xff0c;字节数 35&#xff0c;大于最大值 32","data":{"from":&q…

【goland如果使用xorm执行mysql的存储过程】

goland如果使用xorm执行mysql的存储过程 需求背景 存在用户表和用户邀请关系表&#xff0c;当用户A邀请用户B&#xff0c;则B用户为A用户直接邀请的人&#xff1b;B用户邀请了C用户&#xff0c;则C用户就是A用户的间接邀请人。 如何查询当前用户间接邀请的注册用户有那些&am…

ROS2 学习08 导航Nav2:简介、安装、测试效果、错误处理

1、简介 在ROS2中自动导航使用Nav2来实现。 Nav2 使用几个独立的模块化服务&#xff0c;通过 ROS 2接口&#xff08;例如动作服务器或服务&#xff09;与行为树 (BT) 通信。 Nav2 输入包括&#xff1a;TF转换、一个地图源、一个行为树 (BT) XML 文件和相关的传感器数据源; Nav…

每日学习打卡

文章目录 12月份学习&#xff1a;牛客网刷题 12月份学习&#xff1a;牛客网刷题 12/11 周一12/12 周二12/13 周三12/14 周四12/15 周五牛客网1_非技术快速入门&#xff1a;26-39 ✅牛客网1_非技术快速入门&#xff1a;复习1-39 ✅牛客网2_SQL基础进阶&#xff1a;1-18牛客网2_…