当前位置: 首页 > news >正文

【数据库系统概论】数据库完整性与触发器--复习

在数据库系统概论中,数据库完整性是指确保数据库中数据的准确性、一致性和有效性的一组规则和约束。数据库完整性主要包括实体完整性参照完整性用户定义完整性。以下是详细的复习内容:

1. 数据库完整性概述

数据库完整性是指一组规则,这些规则保证数据库中的数据是有效的、准确的,并且符合预定的要求。它通过一系列的完整性约束来控制数据的有效性和一致性。常见的完整性约束包括:

  • 实体完整性:确保每个实体在表中有唯一标识。
  • 参照完整性:确保表与表之间的引用关系有效。
  • 用户定义完整性:确保数据符合用户定义的特定规则。

2. 实体完整性

实体完整性确保每个关系表中的行(元组)可以通过某一列或一组列来唯一标识,通常使用主键来实现。(即每个关系表中必须要有一个主键,这里的主键可以是单个主键也可以是复合主键)

2.1 定义实体完整性

  • 实体完整性约束:一个关系中的每个元组必须有一个唯一标识符(主键),且主键的值不能为空(NOT NULL)。
  • 实体完整性通过主键来实现,主键中的每个属性都必须有唯一值,并且不能为空。
    ​
    --实体完整性定义的语法
    列名 类名数据类型 PRIMARY KEY,--将该列定义为主键(主码)​

    具体的定义实体完整性的实例代码:

  1. 列级完整性约束定义(即只有一个主码):

    -- 创建学生表,学号作为主键
    CREATE TABLE Students (Sno CHAR(20) PRIMARY KEY,-- Sno 主键约束,确保学号唯一且不为NULLSname CHAR(20) UNIQUE,--这里的UNIQUE是要保证学生名字不重复Sex CHAR(6),Smajor VARCHAR(40)
    );
    
  2. 表级完整性约束(即有多个候选码构成主码):

    -- 创建学生选课表,学号和课程号作为主键
    CREATE TABLE SC(Sno CHAR(8),Cno CHAR(5),Grade SMALLINT,Semester CHAR(5),Teachingclass CHAR(8),,PRIMARY KEY(Sno,Cno)  -- Sno,Cno主键约束,确保(学号,课程号)唯一且不为NULL
    );
    

2.2 实体完整性检查

  • 实体完整性检查是对主键约束的验证,确保插入或更新数据时,主键字段没有重复或空值。

2.3 实体完整性违约检查

  • 当插入的数据违反了主键约束,如主键字段为空或重复,数据库会拒绝插入操作,并返回错误信息。

SQL示例

-- 创建学生表,学号为主键
CREATE TABLE Students (StudentID INT PRIMARY KEY,  -- 主键约束StudentName VARCHAR(50),Age INT
);-- 插入数据(违反实体完整性约束,学号重复)
INSERT INTO Students (StudentID, StudentName, Age)
VALUES (1, 'Alice', 20);INSERT INTO Students (StudentID, StudentName, Age)
VALUES (1, 'Bob', 22);  -- 此操作会失败,因为StudentID=1跟上面那条插入语句里的StudenID重复了,如果这里改成VALUES (2, 'Bob', 22);的话可以成功插入

3. 参照完整性

参照完整性确保数据库表之间的外键关系有效,外键的值必须在被引用的表中存在。

3.1 定义参照完整性

  • 参照完整性约束:表中的外键列的值必须在被引用表的主键列中存在,或者外键列的值可以为NULL
    CREATE TABLE SC(Sno CHAR(8),Cno CHAR(5),Grade SMALLINT,Semester CHAR(5),Teachingclass CHAR(8),PRIMARY KEY(Sno,Cno),--定义表级完整性FOREIGN KEY(Sno) REFERENCES Student(Sno),--在表级定义参照完整性,Sno是外码,被参照表是StudentFOREIGN KEY(Cno) REFERENCES Course(Cno)--在表级定义参照完整性,Cno是外码,被参照表是Course
    );

3.2 参照完整性检查

  • 参照完整性检查的是外键字段的值是否在被引用的父表中存在,或者外键值是否为 NULL(如果外键字段允许为 NULL,则子表中可以有外键列的值为空(NULL)。这样可以确保表与表之间的引用关系是准确和一致的。

3.3 参照完整性违约检查

  • 插入:插入外键值时,必须检查外键值是否在引用表中存在。当向子表插入数据时,数据库会检查外键值是否在父表中存在。如果外键值不在父表的主键或唯一键列中,插入操作将会失败。
    -- 创建父表:Students
    CREATE TABLE Students (StudentID INT PRIMARY KEY,StudentName VARCHAR(50)
    );-- 创建子表:Enrollments,外键StudentID引用Students表中的StudentID
    CREATE TABLE Enrollments (EnrollmentID INT PRIMARY KEY,StudentID INT,CourseName VARCHAR(50),FOREIGN KEY (StudentID) REFERENCES Students(StudentID)  -- 外键约束
    );-- 向Students表插入数据
    INSERT INTO Students (StudentID, StudentName) 
    VALUES (1, 'Alice');-- 尝试向Enrollments表插入数据,插入有效的外键值
    INSERT INTO Enrollments (EnrollmentID, StudentID, CourseName)
    VALUES (1, 1, 'Math');  -- 成功,因为StudentID=1在Students表中存在-- 尝试向Enrollments表插入无效的外键值
    INSERT INTO Enrollments (EnrollmentID, StudentID, CourseName)
    VALUES (2, 2, 'Science');  -- 失败,因为StudentID=2在Students表中不存在
    
  • 删除:如果父表的某行数据被删除,且该行数据在子表中作为外键引用,数据库系统会阻止删除操作,除非使用级联删除(CASCADE DELETE)。在没有级联删除的情况下,父表中的记录不能被删除,因为它们在子表中有外键引用。使用 ON DELETE CASCADE 后,当删除父表中的记录时,相关的子表记录也会被自动删除。
    -- 尝试删除Students表中的学生数据
    DELETE FROM Students WHERE StudentID = 1;  -- 失败,因为该学生在Enrollments表中有外键引用-- 使用级联删除:删除学生时自动删除相关的注册记录
    CREATE TABLE Enrollments (EnrollmentID INT PRIMARY KEY,StudentID INT,CourseName VARCHAR(50),FOREIGN KEY (StudentID) REFERENCES Students(StudentID) ON DELETE CASCADE  -- 级联删除
    );-- 删除学生数据时,相关的注册记录也会自动删除
    DELETE FROM Students WHERE StudentID = 1;  -- 成功,相关的Enrollments记录也被删除
    
  • 更新:当更新父表中的主键值时,数据库会检查是否有子表中的外键引用该主键。如果有引用,数据库会阻止更新操作,除非使用了适当的级联更新(CASCADE UPDATE)操作。
-- 尝试更新父表中的主键
UPDATE Students SET StudentID = 2 WHERE StudentID = 1;  -- 失败,因为StudentID=1在Enrollments表中有外键引用-- 使用级联更新:更新父表主键时自动更新子表中的外键
CREATE TABLE Enrollments (EnrollmentID INT PRIMARY KEY,StudentID INT,CourseName VARCHAR(50),FOREIGN KEY (StudentID) REFERENCES Students(StudentID) ON UPDATE CASCADE  -- 级联更新
);-- 更新父表中的主键时,相关的子表记录中的外键会自动更新
UPDATE Students SET StudentID = 2 WHERE StudentID = 1;  -- 成功,Enrollments表中的外键也被更新

4. 用户定义完整性

用户定义的完整性是数据库中用户根据具体业务需求而设定的规则。这些规则是由数据库的使用者(比如开发者或者数据库管理员)根据实际需要来定义的,主要用来确保数据符合业务逻辑。

4.1 属性上的约束

属性约束是用来限制单个字段中的数据,比如限制字段的值范围或格式,确保数据符合预期。

4.1.1 范围约束(检查字段的值是否在特定范围内)

举个例子,假设我们要求员工的年龄必须大于等于18岁。我们可以在数据库中添加一个约束,确保年龄字段的值始终满足这个条件。

-- 创建员工表,确保年龄大于等于18岁
CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,EmployeeName VARCHAR(50),Age INT CHECK (Age >= 18)  -- 确保员工年龄 >= 18
);

这个约束确保插入的数据中,Age字段的值必须大于或等于18。如果你尝试插入18岁以下的员工,数据库会拒绝这个操作。 

4.1.2 格式约束(确保字段数据格式正确)

有时候,我们希望某个字段的数据符合特定的格式,比如,电子邮件必须符合标准格式。虽然 SQL 本身没有直接的正则表达式支持,但你可以用 CHECK 约束来大致确保格式正确。

-- 创建用户表,确保电子邮件格式正确
CREATE TABLE Users (UserID INT PRIMARY KEY,Email VARCHAR(100),CHECK (Email LIKE '%_@__%.__%')  -- 确保Email符合简单的邮箱格式
);

4.1.3 唯一性约束(确保字段数据唯一) 

有时候,我们希望某个字段的值在表中是唯一的,例如,确保每个用户的邮箱地址唯一。

-- 创建用户表,确保每个邮箱地址唯一
CREATE TABLE Users (UserID INT PRIMARY KEY,Email VARCHAR(100) UNIQUE  -- 确保邮箱地址唯一
);

4.2 元组上的约束

元组约束是对多列(多字段)数据的限制。通常用于确保某些字段的组合是唯一的或满足特定的条件。

4.2.1 组合唯一性约束(确保某些字段组合的值唯一)(组合唯一性约束也叫复合主键唯一性约束)

例如,假设你有一个“学生选课表”,每个学生可以选多门课程,但每个学生只能选一门课程一次。你可以使用组合主键来确保每个学生-课程的组合唯一。

-- 创建学生选课表,确保每个学生只能选修每门课程一次
CREATE TABLE StudentCourses (StudentID INT,CourseID INT,EnrollmentDate DATE,PRIMARY KEY (StudentID, CourseID),  -- 组合主键,确保每个学生每门课程只有一条记录FOREIGN KEY (StudentID) REFERENCES Students(StudentID),FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
);

在这个例子中,StudentIDCourseID 组成了一个复合主键,这确保了一个学生不能重复选同一门课程。 

5. 完整性约束命名句子

完整性约束的命名句子通常包括:

  • 主键约束PRIMARY KEY,确保数据行的唯一性。
  • 外键约束FOREIGN KEY,确保表之间的引用关系。
  • 检查约束CHECK,限制数据值的范围。
  • 唯一性约束UNIQUE,确保列中没有重复的值。

6. 触发器

触发器是数据库中一种特殊的对象,它可以在指定的事件发生时自动执行某些操作。换句话说,触发器是一种自动执行的数据库操作,它与某个表或视图关联,并且根据预定义的规则在插入(INSERT)、更新(UPDATE)删除(DELETE)等数据库操作发生时自动触发执行。

6.1 定义触发器

触发器是绑定到表上的一类对象,可以在INSERTUPDATEDELETE等操作前后触发,自动执行相应的操作。

6.2 触发器的应用场景

  • 自动审计:记录表中的数据变化。
  • 数据验证:在数据修改之前,检查数据是否符合规定的规则。
  • 级联操作:在删除父表记录时,自动删除子表中的相关记录(级联删除)。
  • 自动更新:当某一列数据更新时,自动更新其他相关字段。

6.3 触发器的类型

  1. BEFORE 触发器:在数据修改(插入、更新、删除)之前执行。
  2. AFTER 触发器:在数据修改(插入、更新、删除)之后执行。

6.4 创建触发器

触发器可以在数据插入、删除或更新时执行,如日志记录、自动更新其他表等。

CREATE TRIGGER trigger_name  -- 触发器名称
[BEFORE | AFTER] operation  -- 在操作前或后触发
ON table_name  -- 触发器关联的表
[FOR EACH ROW]  -- 针对每一行数据触发
BEGIN-- 触发器中执行的 SQL 操作
END;

6.5 删除触发器

删除触发器是在数据删除时触发的操作,通常用于执行相关的清理或审计任务。

DROP TRIGGER trigger_name;

6.6 实例:创建触发器

例子 1:插入数据时记录日志

假设我们有一个Employees表,用来记录员工信息。每次向Employees表插入数据时,我们希望自动将插入的数据记录到日志表InsertLog中。

步骤

  1. 创建Employees表。
  2. 创建InsertLog表,用来记录插入操作。
  3. 创建触发器,确保每次插入员工信息时,都会记录到日志表。
    -- 创建员工表
    CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,EmployeeName VARCHAR(50),Position VARCHAR(50)
    );-- 创建插入日志表
    CREATE TABLE InsertLog (LogID INT PRIMARY KEY IDENTITY(1,1),EmployeeID INT,LogDate DATETIME,Action VARCHAR(50)
    );-- 创建触发器,每次插入员工数据时自动记录到日志表
    CREATE TRIGGER LogInsert
    ON Employees
    AFTER INSERT  -- 插入数据后触发
    AS
    BEGIN-- 获取插入的员工ID,并记录到InsertLog表中DECLARE @EmployeeID INT;SELECT @EmployeeID = EmployeeID FROM INSERTED;  -- INSERTED是一个虚拟表,包含插入的数据INSERT INTO InsertLog (EmployeeID, LogDate, Action)VALUES (@EmployeeID, GETDATE(), 'INSERT');
    END;
    

解释

  • 当你向Employees表插入数据时,触发器LogInsert会被自动执行。
  • 触发器会从INSERTED虚拟表中获取新插入的EmployeeID,然后将这些信息插入到InsertLog表中,记录日志。
插入数据时触发器自动执行:
-- 向Employees表插入数据
INSERT INTO Employees (EmployeeID, EmployeeName, Position)
VALUES (1, 'Alice', 'Manager');

插入数据后,InsertLog表中会自动生成一条记录,记录该插入操作。


例子 2:删除员工时级联删除其相关数据

假设我们有一个Orders表,记录了员工的订单信息。我们希望在删除Employees表中的员工记录时,自动删除与该员工相关的订单记录。

-- 创建订单表
CREATE TABLE Orders (OrderID INT PRIMARY KEY,EmployeeID INT,OrderDate DATETIME,FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID)
);-- 创建触发器,在删除员工时级联删除相关订单
CREATE TRIGGER CascadeDeleteOrders
ON Employees
AFTER DELETE  -- 在删除员工后触发
AS
BEGINDECLARE @EmployeeID INT;SELECT @EmployeeID = EmployeeID FROM DELETED;  -- DELETED是一个虚拟表,包含被删除的数据DELETE FROM Orders WHERE EmployeeID = @EmployeeID;
END;

解释

  • 这个触发器在删除Employees表中的员工记录时,会自动删除Orders表中与该员工相关的所有订单记录。
  • DELETED是一个虚拟表,包含已删除的记录。在触发器执行时,DELETED表中会包含被删除的员工信息。

相关文章:

【数据库系统概论】数据库完整性与触发器--复习

在数据库系统概论中,数据库完整性是指确保数据库中数据的准确性、一致性和有效性的一组规则和约束。数据库完整性主要包括实体完整性、参照完整性和用户定义完整性。以下是详细的复习内容: 1. 数据库完整性概述 数据库完整性是指一组规则,这…...

【机器学习:一、机器学习简介】

机器学习是当前人工智能领域的重要分支,其目标是通过算法从数据中提取模式和知识,并进行预测或决策。以下从 机器学习概述、有监督学习 和 无监督学习 三个方面进行介绍。 机器学习概述 机器学习定义 机器学习(Machine Learning&#xff0…...

网关的主要类型和它们的特点

网关,作为网络通信的关键节点,根据其应用场景和功能特点,可以分为多种类型。 1.协议网关 特点: • 协议转换:协议网关的核心功能是转换不同网络之间的通信协议。例如,它可以将IPv4协议的数据包转换为IPv6协…...

NDA:Non-Disclosure Agreement

NDA 是 Non-Disclosure Agreement 的缩写,中文通常翻译为“保密协议”或“非披露协议”。其含义是:在协议约束下,协议的签署方有义务对协议中规定的信息或内容保密,不能向协议之外的第三方披露。 通常,NDA适用于以下场…...

方正畅享全媒体新闻采编系统 imageProxy.do 任意文件读取漏洞复现(附脚本)

0x01 产品描述: 方正畅享全媒体新闻生产系统是以内容资产为核心的智能化融合媒体业务平台,融合了报、网、端、微、自媒体分发平台等全渠道内容。该平台由协调指挥调度、数据资源聚合、融合生产、全渠道发布、智能传播分析、融合考核等多个平台组成,贯穿新闻生产策、采、编、…...

OpenHarmony通过挂载镜像来修改镜像内容,RK3566鸿蒙开发板演示

在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容,修改源码再编译很费时。今天为大家介绍一个便捷的方法,让OpenHarmony通过挂载镜像来修改镜像内容!触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树…...

代理模式和适配器模式有什么区别

代理模式(Proxy Pattern)和适配器模式(Adapter Pattern)是两种结构型设计模式,它们看似相似,但在设计意图、使用场景以及功能上有一些显著的区别。下面是它们的主要区别: 1. 目的与意图 代理模…...

2025年度全国会计专业技术资格考试 (甘肃考区)报名公告

2025年度全国会计专业技术资格考试 (甘肃考区)报名公告 按照财政部、人力资源和社会保障部统一安排,2025年度全国会计专业技术初级、中级、高级资格考试报名即将开始,现将甘肃考区有关事项通知如下: 一、报名条件 …...

ansible-playbook 搭建JDK

文件目录结构 main.yml #首先检测有无java,没有才会安装,有了就直接跳过 - name: Create installation directoryfile: path/var/www/ statedirectory- name: Check javashell: . /etc/profile && java -versionregister: resultignore_errors…...

数据结构(ing)

学习内容 指针 指针的定义: 指针是一种变量,它的值为另一个变量的地址,即内存地址。 指针在内存中也是要占据位置的。 指针类型: 指针的值用来存储内存地址,指针的类型表示该地址所指向的数据类型并告诉编译器如何解…...

杰盛微 JSM4056 1000mA单节锂电池充电器芯片 ESOP8封装

JSM4056 1000mA单节锂电池充电器芯片 JSM4056是一款单节锂离子电池恒流/恒压线性充电器,简单的外部应用电路非常适合便携式设备应用,适合USB电源和适配器电源工作,内部采用防倒充电路,不需要外部隔离二极管。热反馈可对充电电流进…...

webpack5基础(上篇)

一、基本配置 在开始使用 webpack 之前,我们需要对 webpack 的配置有一定的认识 1、5大核心概念 1)entry (入口) 指示 webpack 从哪个文件开始打包 2)output(输出) 制视 webpack 打包完的…...

快速理解MIMO技术

引言 在无线通信领域,MIMO(Multiple-Input Multiple-Output,多输入多输出)技术是一项革命性的进步,它通过在发射端和接收端同时使用多个天线,极大地提高了通信系统的容量、可靠性和覆盖范围。本文简要阐释其…...

【RTD MCAL 篇3】 K312 MCU时钟系统配置

【RTD MCAL 篇3】 K312 MCU时钟系统配置 一,文档简介二, 时钟系统理论与配置2.1 K312 时钟系统2.1.1 PLL2.1.2 MUX_0系统2.1.3 MUX_6 时钟输出2.1.4 option B推荐方案 2.2 EB 配置2.2.1 General 配置2.2.2 McuClockSettingConfig配置2.2.2.1 McuFIRC配置…...

探索Docker Compose:轻松管理多容器应用

探索Docker Compose:轻松管理多容器应用 在现代软件开发中,容器化已经成为构建、部署和扩展应用的主流方式。而Docker Compose作为Docker生态系统的重要组成部分,可以简化多容器应用的管理。本文将深入探讨Docker Compose的核心功能及应用场…...

计算机网络 (18)使用广播信道的数据链路层

一、广播信道的基本概念 广播信道是一种允许一个发送者向多个接收者发送数据的通信信道。在计算机网络中,广播信道通常用于局域网(LAN)内部的主机之间的通信。这种通信方式的主要优点是可以节省线路,实现资源共享。 二、广播信道数…...

【vLLM 学习】欢迎来到 vLLM!

vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。 更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/ vLLM 是一个快速且易于使用的库,专为大型语言模型 (LLM) 的推理和部署…...

现代网络基础设施中的 TCP 握手之下

TCP 3 次握手 在最简单的形式中,TCP 三次握手很容易理解,并且有 大量在线材料都在讨论这个问题。(如果你能读懂 Chinease,你可以看看我之前的一篇文章。 然而,在实际中理解、练习和解决 TCP 问题 世界是另一回事。随…...

GRAPE——RLAIF微调VLA模型:通过偏好对齐提升机器人策略的泛化能力(含24年具身模型汇总)

前言 24年具身前沿模型大汇总 过去的这两年,工作之余,我狂写大模型与具身的文章,加之具身大火,每周都有各种朋友通过CSDN私我及我司「七月在线」寻求帮助/指导(当然,也欢迎各大开发团队与我司合作共同交付&#xff09…...

NeurIPS 2024 | 像素级LLM实现图像视频理解、生成、分割和编辑大统一(昆仑万维等)

Accepted by NeurIPS 2024 文章链接:https://arxiv.org/pdf/2412.19806 项目链接:https://vitron-llm.github.io/ Github链接:https://github.com/SkyworkAI/Vitron 亮点直击 首次提出了一种通用的视觉多模态大语言模型(MLLM&…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

【Oracle】分区表

个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则&#xf…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息&#xff0…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦&#xff0…...

uniapp 字符包含的相关方法

在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...