MySQL修炼手册8:约束与完整性:保证数据的一致性
目录
- 写在开头
- 1 主键与唯一键约束
- 1.1 PRIMARY KEY约束的作用
- 1.2 主键的复合使用
- 1.3 主键的修改与删除
- 1.4 UNIQUE约束的应用场景
- 1.5 主键与唯一键约束的性能影响
- 1.6 主键的自动增长
- 1.7 主键的最佳实践
- 1.8 独特性与业务需求
- 1.9 避免过度使用唯一约束
- 1.10 主键与唯一键的关系
- 2 外键约束
- 2.1 FOREIGN KEY约束的使用
- 2.2 处理外键关联的数据更新和删除
- 2.2.1 CASCADE
- 2.2.2 SET NULL
- 2.2.3 NO ACTION 和 RESTRICT
- 2.2.4 SET DEFAULT
- 2.3 多表级联操作
- 2.4 综合实例
- 2.5 外键约束的性能考虑
- 2.6 动态添加与移除外键约束
- 2.7 外键约束与索引
- 2.8 外键约束的最佳实践
- 3 CHECK约束
- 3.1 CHECK约束的基本概念
- 3.2 使用CHECK约束保障数据合法性
- 3.2.1 确保数值范围
- 3.2.2 确保字符串符合特定格式
- 3.2.3 确保日期符合特定范围
- 3.2.4 多条件组合
- 3.2.5 使用逻辑运算符
- 3.2.6 使用函数
- 3.2.7 确保唯一组合
- 写在最后
写在开头
在数据库设计和管理中,保证数据的完整性和一致性是至关重要的。MySQL通过不同类型的约束来实现这一目标。约束用于限制存储在表中的数据类型,保证数据的准确性和可靠性。本文将深入探讨MySQL中最常用的几种约束:主键(PRIMARY KEY)、唯一键(UNIQUE)、外键(FOREIGN KEY)和检查(CHECK)约束。了解这些约束的使用方法和应用场景,对于创建稳定和高效的数据库至关重要。
1 主键与唯一键约束
1.1 PRIMARY KEY约束的作用
主键约束是数据库表中的核心约束之一,用于唯一标识表中的每一行。在MySQL中,主键约束具有以下特点:
- 唯一性:保证列中的每个值都是唯一的。
- 非空性:主键列不能有NULL值。
- 索引:MySQL会自动为主键列创建索引,优化查询性能。
例如,创建一个具有主键约束的学生表:
CREATE TABLE Students (StudentID int NOT NULL,StudentName varchar(255) NOT NULL,PRIMARY KEY (StudentID)
);
1.2 主键的复合使用
主键不仅可以是单个列,也可以是多个列的组合,称为复合主键。在复合主键中,每个列的组合必须是唯一的。
例如,如果一个课程注册表同时需要学生ID和课程ID来唯一确定一条记录:
CREATE TABLE CourseRegistrations (StudentID int NOT NULL,CourseID int NOT NULL,RegistrationDate date NOT NULL,PRIMARY KEY (StudentID, CourseID)
);
1.3 主键的修改与删除
-
修改主键:在实际使用中,修改主键是一种需要谨慎进行的操作。你可以通过ALTER TABLE命令来修改主键。
ALTER TABLE Students DROP PRIMARY KEY; ALTER TABLE Students ADD PRIMARY KEY (NewColumn); -
删除主键:有时可能需要删除主键约束。这可以通过ALTER TABLE命令实现。
ALTER TABLE Students DROP PRIMARY KEY;
1.4 UNIQUE约束的应用场景
唯一约束确保指定列中的所有值都是不同的。与主键不同,唯一约束允许值为NULL。这在需要确保如电子邮件地址或用户名等属性的唯一性时特别有用。
-
创建唯一约束:
CREATE TABLE Users (UserID int NOT NULL,Username varchar(255) NOT NULL,Email varchar(255),UNIQUE (Email) ); -
添加唯一约束:已经存在的表可以添加唯一约束。
ALTER TABLE Users ADD UNIQUE (Username); -
复合唯一键:与复合主键类似,可以定义多列组合的唯一约束,确保这些列的组合值唯一。
CREATE TABLE Reservations (GuestID int NOT NULL,RoomID int NOT NULL,ReservationDate date NOT NULL,UNIQUE (GuestID, ReservationDate) ); -
删除唯一约束:如果需要,可以从表中删除唯一约束。
ALTER TABLE Users DROP INDEX Email; -
唯一约束与NULL值:唯一约束允许多个NULL值,因为在SQL中,NULL被认为与任何其他值(包括另一个NULL)都不相等。
1.5 主键与唯一键约束的性能影响
-
性能优化:由于主键和唯一键自动创建索引,它们可以显著提高查询的速度。特别是在大型数据集中,合理设置主键和唯一键可以极大地优化数据检索的性能。
-
考虑选择合适的主键:选择短且意义明确的字段作为主键可以提高性能。例如,整数类型的ID通常是一个好选择,因为它们比字符串类型占用更少的空间,并且在比较时更快。
1.6 主键的自动增长
-
AUTO_INCREMENT:在MySQL中,主键字段经常设置为自动增长(AUTO_INCREMENT)。这意味着当新行被插入表中时,主键字段会自动设置为一个唯一的数值。
CREATE TABLE Orders (OrderID int NOT NULL AUTO_INCREMENT,OrderDate date NOT NULL,PRIMARY KEY (OrderID) );这在创建具有唯一标识符需求的表时非常有用,例如订单、票据等。
1.7 主键的最佳实践
- 尽量使用简单的主键:复杂的或多列的主键可能会使数据关联和查询变得复杂,尤其是在涉及多个表的JOIN操作时。
- 避免使用敏感数据:作为主键的数据将在多个地方引用,因此避免使用可能被视为敏感的数据(如社会安全号码)。
1.8 独特性与业务需求
- 主键与业务逻辑:选择主键时,考虑是否反映了业务逻辑。例如,在员工数据库中,员工号可能是一个自然的选择。
- 唯一键与数据规范:唯一键不仅是保证数据唯一性的工具,也是数据规范和完整性的重要部分。例如,防止同一电子邮件地址被多次注册。
通过这些细节的考虑,主键和唯一键约束不仅作为数据完整性的守护者,还能够优化数据库的性能和响应
时间。在数据库设计阶段,合理的规划主键和唯一键约束对于长期维护和扩展数据库系统至关重要。这要求数据库设计者不仅考虑当前的需求,还要预见未来可能的变化和扩展。
1.9 避免过度使用唯一约束
- 性能考虑:虽然唯一约束有助于保持数据的准确性,但过度使用可能会影响性能。每个唯一约束都需要额外的存储空间和处理时间来维护索引。
- 选择合适的字段:在为表设置唯一约束时,应该仔细考虑哪些字段确实需要这种级别的数据完整性保护。例如,用户的电子邮件地址可能需要唯一约束,但他们的姓名则不需要。
1.10 主键与唯一键的关系
- 互补使用:虽然主键和唯一键有相似的作用,但它们通常用于不同的目的。主键用于唯一标识每条记录,而唯一键用于保证特定字段的独特性。
- 业务和逻辑需求:根据业务和逻辑需求,可以灵活地组合使用主键和唯一键来达到既定的数据模型要求。
通过深入了解和正确应用主键和唯一键约束,数据库设计者和开发者可以创建出既高效又可靠的数据存储解决方案。这不仅有助于提高数据的质量和准确性,还可以保证数据的安全性和一致性,从而为用户提供更好的体验和服务。在实际应用中,恰当的使用这些约束是数据管理的基础,对于任何涉及数据存储和处理的项目来说都至关重要。
2 外键约束
外键约束(FOREIGN KEY)是数据库完整性的关键组成部分,用于在两个表之间建立链接,确保数据的一致性和准确性。以下是外键约束的一些重要用法和概念:
2.1 FOREIGN KEY约束的使用
当在一个表中定义了外键,它创建了一个指向另一个表主键或唯一键的引用。这种关系确保了引用表中的数据在被引用表中有相应的匹配记录。
例如,有两个表:Students和Orders。Students表有一个主键StudentID,而Orders表包含一个指向Students表StudentID的外键:
CREATE TABLE Students (StudentID int NOT NULL,StudentName varchar(255),PRIMARY KEY (StudentID)
);CREATE TABLE Orders (OrderID int NOT NULL,StudentID int,OrderDetail varchar(255),PRIMARY KEY (OrderID),FOREIGN KEY (StudentID) REFERENCES Students(StudentID)
);
在此例中,Orders表中的StudentID必须在Students表中存在。
2.2 处理外键关联的数据更新和删除
在外键约束中,主要关注的是当被引用的数据发生变化时,如何处理引用该数据的表。以下是几种处理方式:
2.2.1 CASCADE
CASCADE操作会在父表(被引用表)上执行的更新或删除操作同步到子表(引用表)。这意味着如果一个父表的行被更新或删除,所有引用该行的子表行也会相应地更新或删除。
FOREIGN KEY (StudentID) REFERENCES Students(StudentID) ON DELETE CASCADE ON UPDATE CASCADE
2.2.2 SET NULL
SET NULL操作在父表中的记录被删除或更新时,会将子表中引用该记录的字段自动设置为NULL。这适用于非强制性的关系,其中子表可以继续存在,即使其引用的父表数据被移除。
FOREIGN KEY (StudentID) REFERENCES Students(StudentID) ON DELETE SET NULL ON UPDATE SET NULL
这个设置要求子表中的对应字段必须允许NULL值。
2.2.3 NO ACTION 和 RESTRICT
NO ACTION和RESTRICT实际上在行为上是相同的。当尝试删除或更新父表中的行,并且在子表中存在引用这些行的数据时,这两个选项都会拒绝删除或更新操作。它们确保子表中不会存在无效的引用。
FOREIGN KEY (StudentID) REFERENCES Students(StudentID) ON DELETE RESTRICT ON UPDATE NO ACTION
2.2.4 SET DEFAULT
SET DEFAULT操作在父表的记录被删除或更新时,会将子表中的外键字段设置为某个默认值。这需要在子表中的外键列定义时指定默认值。
FOREIGN KEY (StudentID) REFERENCES Students(StudentID) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT
2.3 多表级联操作
外键约束也可以在多个表之间建立复杂的级联操作。例如,如果你有一个Students表、一个Orders表以及一个OrderDetails表,Orders表可以引用Students表,而OrderDetails表又可以引用Orders表。这种关系允许在任一级别上进行数据更新或删除,而相应的变更会传递到所有相关的表。
2.4 综合实例
创建一个具有外键约束和级联行为的复杂数据库结构,可以更全面地理解这些概念。例如,创建Students、Courses和Enrollments表,其中Enrollments表连接Students和Courses表,并具有相应的外键和级联规则。
CREATE TABLE Courses (CourseID int NOT NULL,CourseName varchar(255),PRIMARY KEY (CourseID)
);CREATE TABLE Enrollments (StudentID int,CourseID int,EnrollmentDate date,FOREIGN KEY (StudentID) REFERENCES Students(StudentID) ON DELETE CASCADE,FOREIGN KEY (CourseID) REFERENCES Courses(CourseID) ON DELETE CASCADE
);
通过掌握外键约束及其各种行为,可以在数据库设计中构建更加健壮和灵活的数据模型,同时确保数据的一致性和完整性。
2.5 外键约束的性能考虑
使用外键约束时,还需要注意其对数据库性能的影响。外键检查可能会增加数据插入、更新和删除操作的成本。在高性能的系统中,有时可能选择在应用程序逻辑而非数据库级别来强制数据完整性,尤其是在处理大量交易的系统中。
2.6 动态添加与移除外键约束
在某些情况下,你可能需要在表已经创建之后添加或移除外键约束。这可以通过ALTER TABLE命令实现:
-
添加外键约束:
ALTER TABLE Orders ADD FOREIGN KEY (StudentID) REFERENCES Students(StudentID); -
移除外键约束:
ALTER TABLE Orders DROP FOREIGN KEY Orders_ibfk_1;
在移除外键约束时,需要指定外键的名称,这可以通过查询表的创建信息或使用SHOW CREATE TABLE命令来获取。
2.7 外键约束与索引
在实施外键约束时,还需考虑索引的使用。为了提高性能,建议在作为外键的列上创建索引。当MySQL强制执行外键约束时,如果被引用的列(通常是主键或唯一键)和引用列都有索引,这将显著提高查询和更新操作的效率。
-
自动索引创建:在某些情况下,当你为一个列添加外键约束时,MySQL会自动为该列创建索引。但这并不总是发生,取决于具体的数据库版本和设置。
-
手动添加索引:如果自动索引创建未发生,或者你需要更精细地控制索引的类型和性能,可以手动添加索引。例如,为
Orders表中的StudentID列添加索引:CREATE INDEX idx_student_id ON Orders (StudentID);
2.8 外键约束的最佳实践
在实际应用中,合理使用外键约束可以带来许多好处,但也要注意避免过度使用,因为它们可能会影响数据库的性能和灵活性:
-
谨慎使用外键:对于核心业务逻辑至关重要的数据完整性保护,应使用外键。但在某些情况下,特别是对于大规模的、高频写入的数据库系统,应考虑通过应用逻辑来维护数据完整性。
-
避免复杂的级联操作:虽然级联更新和删除操作可以简化某些数据库维护任务,但在复杂的数据库架构中,过度使用级联可能会导致不可预测的结果和性能瓶颈。
-
定期审查外键约束:随着业务的发展,某些外键约束可能变得不再适用或不必要。定期审查并调整这些约束可以保证数据库架构与业务需求保持一致。
3 CHECK约束
3.1 CHECK约束的基本概念
CHECK约束是MySQL中用于确保表中特定列的数据符合特定条件的功能。它在数据插入或更新时自动执行,如果数据不符合定义的条件,操作将被拒绝。CHECK约束提高了数据的完整性和质量,避免了无效或不合适的数据进入数据库。
3.2 使用CHECK约束保障数据合法性
3.2.1 确保数值范围
例如,限制年龄字段必须在1到100之间:
CHECK (Age BETWEEN 1 AND 100)
3.2.2 确保字符串符合特定格式
如果需要确保某个字符串字段遵循特定格式,例如,一个国家代码必须是两个大写字母:
CHECK (CountryCode REGEXP '^[A-Z]{2}$')
3.2.3 确保日期符合特定范围
限制日期字段必须在特定日期之后:
CHECK (StartDate > '2024-01-01')
3.2.4 多条件组合
可以在一个CHECK约束中组合多个条件。例如,确保一个薪水字段既不是负数也不是过高的数值:
CHECK (Salary >= 0 AND Salary <= 100000)
3.2.5 使用逻辑运算符
使用AND、OR和NOT等逻辑运算符来创建更复杂的条件。例如,确保员工的状态是活动的或者,如果不活动,终止日期必须存在:
CHECK ((IsActive = 1) OR (IsActive = 0 AND TerminationDate IS NOT NULL))
3.2.6 使用函数
在CHECK约束中使用函数来验证数据。例如,确保某个字符串字段是一个有效的电子邮件地址:
CHECK (Email LIKE '%_@__%.__%')
3.2.7 确保唯一组合
虽然UNIQUE约束通常用于这个目的,但在某些情况下,CHECK约束可以用来确保字段的组合是唯一的。例如:
CHECK (NOT EXISTS (SELECT * FROM table WHERE column1=value1 AND column2=value2))
写在最后
在数据库设计和数据维护过程中,合理使用各种约束至关重要。它们不仅帮助维护数据的一致性和完整性,还能在某种程度上提高数据库操作的效率。理解并正确应用这些约束,可以使你的数据库更加健壯和可靠。无论是设计一个新的数据库还是优化现有的数据库,掌握MySQL中的约束都是任何数据库管理员或开发者的基本技能。
相关文章:
MySQL修炼手册8:约束与完整性:保证数据的一致性
目录 写在开头1 主键与唯一键约束1.1 PRIMARY KEY约束的作用1.2 主键的复合使用1.3 主键的修改与删除1.4 UNIQUE约束的应用场景1.5 主键与唯一键约束的性能影响1.6 主键的自动增长1.7 主键的最佳实践1.8 独特性与业务需求1.9 避免过度使用唯一约束1.10 主键与唯一键的关系 2 外…...
React入门 - 03(初识 React 组件和 JSX)
本章内容 目录 1.初识 React 组件2.关于 JSX 继上一节的工程案例,我们这一节主要了解一下 React组件和 “JSX 语法”。 前置知识点:ES6模块化&继承 1.初识 React 组件 1、打开 src/index.js文件(项目的入口文件)内容&…...
华为OD机试 - 反射计数(Java JS Python C)
题目描述 给定一个包含 0 和 1 的二维矩阵。 给定一个初始位置和速度,一个物体从给定的初始位置出发,在给定的速度下进行移动,遇到矩阵的边缘则发生镜面发射。 无论物体经过 0 还是 1,都不影响其速度。 请计算并给出经过 t 时间单位后,物体经过 1 点的次数。 矩阵以左…...
Linux系统中使用systemctl命令控制软件的启动和关闭
Linux系统很多软件(内置或第三方)均支持使用systemctl命令控制:启动、停止、开机自启 能够被systemctl管理的软件,一般也称之为:服务 1.功能和语法 功能:控制系统服务的启动关闭等 语法:syst…...
2024年01月微软更新Bug 已解决 !Explorer.EXE 提示:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。
前倾概要 近期大量出现如上图问题,杀毒,系统急救箱都没反应,罪魁祸首就是微软更新! 点击什么都是:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。 但软件使用正常,还能通过建立…...
Qt/QML编程学习之心得:slider(34)
滑条slider,有时也成为进度条progressbar,在GUI界面中也是经常用到的。 import QtQuick 2.9 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.2ApplicationWindow {id:rootvisible: truewidth: 1920height: 720//title: qsTr("Hello World&q…...
使用metricbeat 监控多ES集群
背景 ES 本身自带 监控,属于xpack 中的内容,为商业版,需要收费; 并且 monitor 功能必须要在security开启后才能使用,还有就是集群监控自己,将采集到的性能数据保存到本集群,这是一个比较差的设…...
阿里云服务器+宝塔 (尝试部署一个最简单的静态页面)
1. 免费白嫖一个阿里服务器 进入网址:服务器购买地址 选择预装宝塔面板 购买完成后前往控制台 查看当前实例 设置或修改密码 设置用户名和密码 2. 远程连接到服务器 2.1. 使用Workbench连接 输入用户名和密码连接成功页面如下: 2.2. 使…...
每日一题——LeetCode1160.拼写单词
方法一 个人方法: 先统计chars里每个字符出现的次数,再对words里每个字符串统计每个字符出现的字符,当: 1、字符串里出现chars里没有的字符 2、字符串里某个字符出现的次数大于该字符在chars里出现的次数 以上两种情况则不符合…...
物联网协议Coap之Core和NetWork简介
目录 前言 一、Coap的Core包 1、Coap对象 2、Message对象 3、Request对象 4、Response对象 二、Coap的NetWork调试 1、UDP运行模式 2、Network消息接收 3、Sender线程发送数据 三、总结 前言 在之前的博文中,对Californium中Coap的实现进行了简要的介绍&a…...
Java SE入门及基础(10)
switch选择结构 1. 概念 switch 表示开关的意思,为了帮助理解,下面以线路为例,进行解释说明 上图中表示一条带有多个开关的线路,当开关打开时,该开关所控制的灯即被点亮。 2. 语法规则 switch ( 表达式 ){ //…...
Docker五部曲之二:Docker引擎
文章目录 前言Docker引擎镜像管理容器管理容器运行前台运行和后台运行容器识别重启策略清除 容器日志 数据管理卷挂载创建和管理卷启动带有卷的容器通过Docker Compose使用卷使用只读卷备份、恢复和迁移卷 绑定挂载用绑定挂载启动一个容器Docker Compose使用绑定挂载使用只读绑…...
简单说一下原型与原型链
文章目录 原型原型链 原型 简单来说原型就像是对象的 “爸爸”,每个对象都有一个原型。当你创建一个对象时,这个对象就会有一个内部链接,指向它的原型。你可以把原型想象成对象的一种模板,对象可以从中继承属性和方法。 举个例子…...
11Spring IoC注解式开发(上)(元注解/声明Bean的注解/注解的使用/负责实例化Bean的注解)
注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发。 注解开发的优点:提高开发效率 注解开发的缺点:在一定程度上违背了OCP原则,使用注解的开发的前提是需求比较固定,变动较小。 1 注解的注解称为元注解 自定义一个注解: package com.sunspl…...
k8s 部署Jenkins项目
1、基于helm 部署jenkins 要求:当前集群配置了storageClass,并已指定默认的storageClass,一般情况下,创建的storageClass即为默认类 指定默认storageClass的方式 # 如果是新创建默认类: apiVersion: storage.k8s.io/v1…...
#每日一题#力扣#2085.统计出现过一次的公共字符串
给你两个字符串数组 words1 和 words2 ,请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 示例 1: 输入:words1 [“leetcode”,“is”,“amazing”,“as”,“is”], words2 [“amazing”,“leetcode”,“is”] 输出:…...
Python系列(1):简洁优雅,功能强大的编程语言
Python:简洁优雅,功能强大的编程语言 一、Python的特点二、Python的应用领域 在当今的编程世界中,Python已经成为了一种无处不在的语言。它不仅简单易学,而且功能强大,支持多种编程范式,包括面向对象编程、…...
HarmonyOS应用开发学习笔记 arkTS自定义弹窗(CustomDialog)简单使用 arkTS弹出框回调、监听
HarmonyOS应用开发学习笔记 arkTS自定义弹窗(CustomDialog)简单使用 1、CustomDialog装饰器用于装饰自定义弹框 1、定义弹出框 CustomDialog CustomDialog export struct CustomDialogExample {controller: CustomDialogControllerbuild() {Column() {…...
RabbitMQ(六)消息的持久化
目录 一、简介1.1 定义1.2 消息丢失的场景 二、交换机的持久化方式一:直接 new方式二:channel.exchangeDeclare()方式三:ExchangeBuilder【推荐】 三、队列的持久化方式一:直接 new方式二:channel.queueDeclare()方式三…...
mybatisplus配置
一、新建项目:com.saas.plusdemo 二、配置pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
