第十三章:约束
第十三章:约束
13.1:约束(constraint)概述
-
为什么需要约束
数据完整性(
Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。为了保证数据的完整性,
SQL规范以约束的方式对表数据进行额外的条件限制。- 实体完整性(
Entity Integrity) - 域完整性(
Domain Integrity) - 引用完整性(
Referential Integrity) - 用户自定义完整性(
User-defined Integrity)
- 实体完整性(
-
什么是约束
约束是表级的强制规定。可以在创建表时规定约束(通过
CREATE TABLE语句),或者在表创建之后通过ALTER TABLE语句规定约束。 -
约束的分类
-
根据约束数据列的限制
- 单列约束:每个约束只约束一列
- 多列约束:每个约束可约束多列数据
-
根据约束的作用范围
- 列级约束:只能作用在一个列上,跟在列的定义后面。
- 表级约束:可以作用在多个列上,不与列一起,而是单独定义。
位置 支持的约束类型 是否可以起约束名 列级约束 列的后面 语法都支持,但外键没有效果 不可以 表级约束 所有列的下面 默认和非空不支持,其他支持 可以(主键没有效果) -
根据约束起的作用
NOT NULL:非空约束,规定某个字段不能为空UNIQUE:唯一约束,规定某个字段在整个表中唯一的PRIMARY KEY:主键(非空且唯一)约束FOREIGN KEY:外键约束CHECK:检查约束DEFAULT:默认值约束
-
13.2:非空约束
-
作用
限定某个字段/某列的值不允许为空。
-
关键字
NOT NULL -
特点
- 默认,所有的类型的值都可以是
NULL,包括INT、FLOAT等数据类型。 - 非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空。
- 一个表可以有很多列都分别限定了非空。
- 空字符串"不等于
NULL,0也不等于NULL"。
- 默认,所有的类型的值都可以是
-
添加非空约束
# 建表时 CREATE TABLE test1( id INT NOT NULL, last_name VARCHAR(15) NOT NULL, email VARCHAR(25), salary DECIMAL(10, 2) );#建表后 ALTER TABLE test1 MODIFY email VARCHAR(25) NOT NULL; -
删除非空约束
ALTER TABLE test1 MODIFY email VARCHAR(25) NULL;
13.3:唯一约束
-
作用
用来限制某个字段/某列的值不能重复。【允许出现多个空值:
NULL】 -
关键字
UNIQUE -
特点
- 同一个表可以有多个唯一约束。
- 唯一约束可以是某一列的值唯一,也可以多个列组合的值唯一。
- 唯一性约束允许列值为空。
- 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
MYSQL会给唯一约束的列上默认创建一个唯一索引。
-
添加唯一约束
-
键表时添加
CREATE TABLE test2( id INT UNIQUE, # 列级约束 last_name VARCHAR(15), email VARCHAR(25), salary DECIMAL(10, 2), #表级约束 CONSTRAINT uk_test2_email UNIQUE(email) ); -
建表后指定唯一约束
#方式1: ALTER TABLE test2 ADD CONSTRAINT uk_test2_sal UNIQUE(salary); #方式2: ALTER TABLE test2 MODIFY last_name VARCHAR(15) UNIQUE;
-
-
复合唯一约束
CREATE TABLE USER( id INT, `name` VARCHAR(15), `password` VARCHAR(25), #表级约束 CONSTRAINT uk_user_name_pwd UNIQUE(`name`, `password`) ); -
删除唯一约束
- 添加唯一性约束的列上也会自动创建唯一索引。
- 删除唯一约束只能通过删除唯一索引的方式删除。
- 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
- 如果创建唯一约束时并未指定名称,如果是单列,就默认和列名相同,如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。
ALTER TABLE test2 DROP INDEX last_name;ALTER TABLE test2 DROP INDEX uk_test2_sal;
13.4:PRIMARY KEY约束
-
作用
用来唯一标识表中的一行记录。
-
关键字
primary key -
特点
- 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。
- 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
- 主键约束对应着表中的一列或者多列(复合主键)。
- 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
MySQL的主键名是PRIMARY,就算自己命名了主键约束名也没用。- 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就会自动删除了。
- 注意:不要修改主键字段的值。修改了主键的值,可能会破坏数据的完整性。
-
添加主键约束
-
键表时指定主键约束
# 方式一 CREATE TABLE test4( id INT PRIMARY KEY, last_name VARCHAR(15), salary DECIMAL(10, 2), email VARCHAR(25) );# 方式二 CREATE TABLE test5( id INT, last_name VARCHAR(15), salary DECIMAL(10, 2), email VARCHAR(25), CONSTRAINT pk_test5_id PRIMARY KEY(id) #没有必要起名字 ); -
建表后添加主键约束
CREATE TABLE test6( id INT, last_name VARCHAR(15), salary DECIMAL(10, 2), email VARCHAR(25) );ALTER TABLE test6 ADD PRIMARY KEY(id);
-
-
复合主键
CREATE TABLE user1( id INT, NAME VARCHAR(15), PASSWORD VARCHAR(25), PRIMARY KEY (NAME, PASSWORD) ); -
删除主键约束
ALTER TABLE test6 DROP PRIMARY KEY;
13.5:自增列
-
作用
某个字段的值自增。
-
关键字
atuo_increment -
特点和要求
- 一个表最多只能有一个自增长列。
- 当需要产生唯一标识或顺序值时,可设置自增长。
- 自增长列约束的列必须是键列(主键列,唯一键列)。
- 自增约束的列的数据类型必须是整数类型。
- 如果自增列指定了0和
null,会在当前最大值的基础上自增;如果自增列手动指定了具体值,直接赋值为具体值。
-
指定自增约束
-
建表是指定自增列
CREATE TABLE test7( id INT PRIMARY KEY AUTO_INCREMENT, last_name VARCHAR(15) ); -
建表后指定自增长列
CREATE TABLE test8( id INT PRIMARY KEY, last_name VARCHAR(15) );ALTER TABLE test8 MODIFY id INT AUTO_INCREMENT;
-
-
删除自增约束
ALTER TABLE test8 MODIFY id INT; -
MySQL 8.0新特性-自增变量的持久化 在
MySQL 8.0之前,自增主键AUTO_INCREMENT的值如果大于max(primary key) + 1,在MySQL重启后,会重置AUTO_INCREMENT=max(primary key) + 1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题。 在
MySQL 5.7系统中,对于自增主键的分配规则,是由InnoDB数据字典内部一个计数器来决定的,而该计数器只在内存中维护,并不会持久到磁盘中。当数据库重启时,该计数器会被初始化。
MySQL 8.0将自增主键的计数器持久化到重做日志中。每次计数器发生改变,都会将其写入重做日志中。如果数据库重启,InnoDB会根据重做日志中的信息来初始化计数器的内存值。
13.6:FOREIGN KEY约束
-
作用
限定某个表的某个字段的引用完整性。
-
关键字
FOREIGN KEY -
主表和从表/父表和子表
- 主表(父表):被引用的表,被参考的表。
- 从表(子表):引用别人的表,参考别人的表。
-
特点
- 从表的外键列,必须引用/参考主表的主键或唯一约束的列。
- 在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名,也可以指定外键约束名。
- 创建(
CREATE)表时看指定外键约束的话,先创建主表,在创建从表。 - 删除表时,先删从表(或先删除外键约束),在删除主表。
- 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据。
- 在"从表"中指定外键约束,并且一个表可以建立多个外键约束。
- 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。如果类型不一样,创建子表时,就会出现错误
ERROR 1005(HY000): Can't create table'database.tablename'(errno: 150)。 - 当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是外键的约束名。
- 删除外键约束后,必须手动删除对应的索引。
-
添加外键约束
-
建表时添加外键约束
#①先创建主表 CREATE TABLE dept1( dept_id INT PRIMARY KEY, dept_name VARCHAR(15) ); #②再创建从表 CREATE TABLE emp1( emp_id INT PRIMARY KEY AUTO_INCREMENT, emp_name VARCHAR(15), department_id INT,CONSTRAINT fk_emp1_dept_id FOREIGN KEY (department_id) REFERENCES dept1(dept_id) ); -
建表后添加外键约束
CREATE TABLE dept2( dept_id INT PRIMARY KEY, dept_name VARCHAR(15) );CREATE TABLE emp2( emp_id INT PRIMARY KEY AUTO_INCREMENT, emp_name VARCHAR(15), department_id INT );ALTER TABLE emp2 ADD CONSTRAINT fk_emp2_dept_id FOREIGN KEY(department_id) REFERENCES dept2(dept_id);
-
-
约束等级
Cascade方式:在父表上update/delete记录时,同步update/delete掉子表的匹配记录。Set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子表的外键列不能为not null。No action方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作。Restrict方式:同no action,都是立即检查外键约束。Set default方式:(在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别。
如果没有指定等级,就相当于
Restrict方式。对于外键约束,最好是采用:ON UPDATE CASCADE ON DELETE RESTRICT的方式。CREATE TABLE dept( did INT PRIMARY KEY, #部门编号 dname VARCHAR(50) #部门名称 );CREATE TABLE emp( eid INT PRIMARY KEY, #员工编号 ename VARCHAR(5), #员工姓名 deptid INT, #员工所在的部门 #把修改操作设置为级联修改等级,把删除操作设置为set null等级 FOREIGN KEY (deptid) REFERENCES dept(did) ON UPDATE CASCADE ON DELETE SET NULL );INSERT INTO dept VALUES(1001, '教学部'); INSERT INTO dept VALUES(1002, '财务部'); INSERT INTO dept VALUES(1003, '咨询部');INSERT INTO emp VALUES(1, '张三', 1001); #在添加这条记录时,要求部门表有1001部门 INSERT INTO emp VALUES(2, '李四', 1001); INSERT INTO emp VALUES(3, '王五', 1002);UPDATE dept SET did = 1004 WHERE did = 1002;DELETE FROM dept WHERE did = 1004;SELECT * FROM dept; SELECT * FROM emp;/* dept表 +--------+------------+ | did | dname | +--------+------------+ | 1001 | 教学部 | +--------+------------+ | 1003 | 咨询部 | +--------+------------+ *//* emp表 +--------+------------+------------+ | eid | ename | deptid | +--------+------------+------------+ | 1 | 张三 | 1001 | +--------+------------+------------+ | 2 | 李四 | 1001 | +--------+------------+------------+ | 3 | 王五 | null | +--------+------------+------------+ */ -
删除外键约束
ALTER TABLE emp1 DROP FOREIGN KEY fk_emp1_dept_id; -
开发中应用场景
-
如果两个表之间有关系(一对一、一对多),他们之间是否一定要建外键约束?
不是。
-
建和不建外键约束有什么区别?
建外键约束,你的操作(创建表、删除表、添加、修改、删除)会受到限制,从语法层面受到限制。
不建外键约束,你的操作(创建表、删除表、添加、修改、删除)不受限制,要保证数据的引用完整性,只能依靠程序员的自觉,或者是在
Java程序中进行限定。 -
那么建和不建外建约束和查询有没有关系?
没有。
-
说明
在
MySQL里,外建约束是有成本的,需要消耗系统资源。对于大并发的SQL操作,有可能会不适合。比如大型网站的中央数据库,可能会因为外建约束的系统开销而变得非常慢。所以,MySQL允许你不使用系统自带的外键约束,在应用层面完成检查数据的一致性的逻辑。也就是说,即使你不用外键约束,也要想办法通过应用层面的附加逻辑,来实现外键约束的功能,确保数据的一致性。 -
阿里开发规范
【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
-
13.7:CHECK约束
-
作用
检查某个字段的值是否符合要求,一般指的是值的范围。
-
关键字
CHECK -
说明:
MySQL 5.7不支持
MySQL 5.7可以使用check约束,但check约束对数据验证没有任何作用。添加数据时,没有任何错误或警告。但是**MySQL 8.0中可以使用check约束了**。CREATE TABLE test10( id INT, last_name VARCHAR(15), salary DECIMAL(10, 2) CHECK(salary > 2000) );INSERT INTO test10 VALUES(1, 'Tom', 2500);#添加失败 INSERT INTO test10 VALUES(2, 'Tom1', 1500);SELECT * FROM test10;/* test10表 +--------+------------+------------+ | id | last_name | salary | +--------+------------+------------+ | 1 | Tom | 2500.00 | +--------+------------+------------+ */
13.8:DEFAULT约束
-
作用
给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显示赋值,则赋值为默认值。
-
关键字
DEFAULT -
字段加默认值
-
建表时添加默认值
CREATE TABLE test11( id INT, last_name VARCHAR(15), salary DECIMAL(10, 2) DEFAULT 2000 ); -
建表后添加默认值
CREATE TABLE test12( id INT, last_name VARCHAR(15), salary DECIMAL(10, 2) );ALTER TABLE test12 MODIFY salary DECIMAL(8, 2) DEFAULT 2500;
-
-
删除默认值约束
ALTER TABLE test12 MODIFY salary DECIMAL(8, 2);
相关文章:
第十三章:约束
第十三章:约束 13.1:约束(constraint)概述 为什么需要约束 数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。 为…...
M.2 SSD接口详解
一、M.2简介 M.2接口是一种新的主机接口方案,可以兼容多种通信协议,如sata、PCIe、USB、HSIC、UART、SMBus等。 M.2接口是为超极本(Ultrabook)量身定做的新一代接口标准,以取代原来的mSATA接口。无论是更小巧的规格尺…...
在本地Windows 11 系统的桌面版Docker上搭建PlantUML
文章目录 在本地Windows系统的桌面版Docker上搭建PlantUML简介步骤步骤 1:安装Docker Desktop步骤 2:启动Docker Desktop步骤 3:拉取PlantUML镜像步骤 4:运行PlantUML容器步骤 5:访问PlantUML Web界面 结论参考资料 结…...
mysql的sql_mode模式
1、sql_mode是MySQL中的一个系统变量,用于设置服务器在执行SQL语句时的行为模式。它可以控制服务器的严格性和特性,包括数据校验、日期处理、空值处理等。 下面是一些常见的sql_mode模式及其作用: STRICT_ALL_TABLES:为所有存储…...
chatgpt赋能python:Python编程必备之OpenCV库下载与安装
Python编程必备之OpenCV库下载与安装 作为目前最热门的计算机视觉库之一,OpenCV在人工智能领域中发挥着巨大的作用。而Python作为一门强大的编程语言,在OpenCV的使用上也有其独特的优势。本文将介绍Python如何下载和安装OpenCV库,以及如何引…...
sparkSQL的使用
sparksql只能处理结构化数据 基于rdd构建dataframe对象 from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StringType, IntegerTypeif __name__ __main__:spark SparkSession.builder.appName(test).master(local[*]).getOrCreate()sc spa…...
gitignore的语法
.gitignore 文件是用来告诉 Git 哪些文件或目录不应该被跟踪的。下面是一些常见的 .gitignore 文件语法规则: 空行或以#开头的行将被 Git 忽略,可以用作注释。 星号 * 代表零个或多个任意字符。例如, *.txt 会匹配所有的 .txt 文件。 问号 ? 代表一个…...
长袋除尘器
长袋低压脉冲除尘器是具有先进水平的高效袋式除尘设备,是一种处理风量大、清灰效果好、除尘效率高、运行可靠、维护方便、占地面积小的大型除尘设备。 工作机理 1、过滤原理: 长袋低压脉冲除尘器含尘气体由进风口进入,经过灰斗时,气体中部分大颗粒粉尘…...
HTML+CSS实训——Day02——仿一个网易云音乐的登陆界面
仓库链接:https://github.com/MengFanjun020906/HTML_SX 前言 今天要继续完成我们的音乐软件了,昨天写完了封面,今天该完成开屏广告和登陆界面了。 登陆界面代码 <!DOCTYPE html> <html lang"en"> <head><meta charse…...
css蓝桥杯--电影院排座位
目录 一、介绍二、准备三、⽬标四、代码五、知识点六、完成 一、介绍 随着⼈们⽣活⽔平的⽇益提升,电影院成为了越来越多的⼈休闲娱乐,周末放松的好去处。各个城市的电影院数量也随着市场的需求逐年攀升。近⽇,⼜有⼀个电影院正在做着开张前…...
c++学习——多态
多态 **多态的语法****多态的底层原理图****多态案1——计算机类****纯虚函数和抽象类****多态案例2——饮品****虚析构和纯虚析构****多态案例3—— 电脑组装** 多态是C面向对象三大特性之一 多态分为两类 静态多态:函数重载和运算符重载属于静态多态,复用函数名 动…...
Java SPI机制及原理详解
前言 Java SPI (Service Provider Interface) 是一种重要的组件化方式,它可以让程序在运行时动态地装载一些实现模块,从而增强程序的可扩展性和灵活性。本文将详细介绍 Java SPI 的基本概念、原理以及使用方法。 1. 什么是Java SPI Java SPI 是一种标准…...
不压缩打包layui
手动打包 下载layui源码(当前版本2.6.4),并解压缩 下载地址:layui gitee 安装nodejs(v10.24.1) 下载链接 windows-x64 安装cnpm npm install -g cnpm -registryhttps://registry.npm.taobao.org全局安…...
过去、现在及未来
人生最邪恶的地方在于,只能年轻一次 回顾下我毫无规划的,且已经消耗掉的青春 一:过去 19岁,进入大学,兼职、玩儿、暧昧 20-21岁,初创软件公司打杂、恋爱、暧昧 22、23、24岁,上海ÿ…...
leetcode701. 二叉搜索树中的插入操作(java)
二叉搜索树中的插入操作 leetcode701. 二叉搜索树中的插入操作题目描述 递归解题解题思路代码演示 二叉树专题 leetcode701. 二叉搜索树中的插入操作 原题链接: 来源:力扣(LeetCode) 链接:https://leetcode.cn/problem…...
Docker的容器管理操作
1、创建容器 容器创建:就是将镜像加载到容器的过程。 创建容器时如果没有指定容器名称,系统会自动创建一个名称。 新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。 docker create创建的容器…...
计算机组成原理——中央处理器
文章目录 **一 CPU的功能和基本结构****1 CPU的功能****2 [基本结构](http://t.csdn.cn/bpCt3)****2.1 运算器****2.2 控制器** **二 指令执行过程****1 指令周期****2 指令周期的数据流****2.1 取指周期****2.2 间址周期****2.3 执行周期****2.4 中断周期** **3 指令的执行方案…...
tidb变更大小写敏感问题的总结
作者: sustyle 原文来源: https://tidb.net/blog/2a72bc13 1 背景 近期,我们线上的tidb集群就遇到一个变更忽略大小写的需求,本来以为一个改表工单就解决了,但是业务反馈工单完成后,大小写仍旧敏感&…...
法规标准-UN R158标准解读
UN R158是做什么的? UN R158全名为针对驾驶员识别车辆后方弱势道路使用者,联合国对倒车系统和机动车的统一规定,该法规涉及批准倒车和机动车辆的装置,主要为保证倒车时避免碰撞,方便驾驶员观察了解车辆后部人员和物体…...
160个CrackMe之002
这道题就很简单 有了第一道题目的支持 我们就能做 首先 我们先要下载Msvbvm50.dll Msvbvm50.dll下载_Msvbvm50.dll最新版下载[修复系统丢失文件]-下载之家 然后我们可以运行程序了 比之前那个还简单 就是输入 然后比对 报错或者成功 开始逆向分析 先去常量中进行查找 找…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
