Apache Doris 基础 -- 数据表设计(使用AUTO_INCREMENT)

导入数据时,Doris将表唯一值分配给自动递增列中没有指定值的行。

1、功能

对于包含自动递增列的表,在数据导入期间:

  • 如果目标列不包括自动递增列,Doris将用生成的值填充自动递增列。
  • 如果目标列包括自动递增列,则为该列导入的数据中的空值将被Doris生成的值替换,而非空值将保持不变。注意,非空值可能会破坏自动增量列值的唯一性。

1.1 唯一性

Doris确保在自动递增列上生成的值具有表范围内的唯一性。但是,需要注意的是,自动递增列的唯一性只保证由Doris自动填充的值的唯一性,而不考虑用户提供的值。如果用户通过指定自动递增列显式地为该表插入用户提供的值,则无法保证这种唯一性。

1.2 聚集性

Doris确保自动递增列上生成的值是密集的,但它不能保证导入期间自动递增列中自动生成的值是完全连续的。因此,在导入期间,自动增量列生成的值可能会出现一些跳跃。这是因为出于性能考虑,每个BE都会缓存一部分预分配的自动增量列值,并且这些缓存的值在不同的BE之间不会相交。此外,由于这种缓存机制,Doris不能保证以后在物理时间轴上导入的自动增量列上自动生成的值比以前导入的值大。因此,自动递增列分配的值不能用于确定导入的时间顺序。

2、语法

要使用自动递增列,需要在表创建期间(CREATE-TABLE)将AUTO_INCREMENT属性添加到相应的列。要手动指定自动递增列的起始值,可以在创建表时使用AUTO_INCREMENT(start_value)语句。如果不指定,则默认起始值为1

2.1 Examples

  1. 创建一个 Duplicate 表,其中一个键列作为自动递增列:
CREATE TABLE `demo`.`tbl` (`id` BIGINT NOT NULL AUTO_INCREMENT,`value` BIGINT NOT NULL
) ENGINE=OLAP
DUPLICATE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 3"
);
  1. 创建一个 Duplicate 表,其中一个键列作为自动递增列,并设置起始值为100:
CREATE TABLE `demo`.`tbl` (`id` BIGINT NOT NULL AUTO_INCREMENT(100),`value` BIGINT NOT NULL
) ENGINE=OLAP
DUPLICATE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 3"
);

3.创建一个 Duplicate 表,其中一个值列作为自动递增列:

CREATE TABLE `demo`.`tbl` (`uid` BIGINT NOT NULL,`name` BIGINT NOT NULL,`id` BIGINT NOT NULL AUTO_INCREMENT,`value` BIGINT NOT NULL
) ENGINE=OLAP
DUPLICATE KEY(`uid`, `name`)
DISTRIBUTED BY HASH(`uid`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 3"
);
  1. 创建一个Unique 表,其中一个键列作为自增列:
CREATE TABLE `demo`.`tbl` (`id` BIGINT NOT NULL AUTO_INCREMENT,`name` varchar(65533) NOT NULL,`value` int(11) NOT NULL
) ENGINE=OLAP
UNIQUE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"enable_unique_key_merge_on_write" = "true"
);
  1. 创建一个Unique表,其中一个值列作为自动增量列:
CREATE TABLE `demo`.`tbl` (`text` varchar(65533) NOT NULL,`id` BIGINT NOT NULL AUTO_INCREMENT,
) ENGINE=OLAP
UNIQUE KEY(`text`)
DISTRIBUTED BY HASH(`text`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"enable_unique_key_merge_on_write" = "true"
);

2.2 制约和限制

  • 只有Duplicate 模型表和Unique 模型表可以包含自动递增列。
  • 一个表最多只能包含一个自动递增列。
  • 自动递增列的类型必须为BIGINT并且必须为NOT NULL
  • 手动指定的自动递增列的起始值必须大于或等于0。

3、用法

3.1 导入

考虑以下表:

CREATE TABLE `demo`.`tbl` (`id` BIGINT NOT NULL AUTO_INCREMENT,`name` varchar(65533) NOT NULL,`value` int(11) NOT NULL
) ENGINE=OLAP
UNIQUE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"enable_unique_key_merge_on_write" = "true"
);

当使用insert into语句导入数据而没有指定自动递增的列id时,id列将自动被生成的值填充。

mysql> insert into tbl(name, value) values("Bob", 10), ("Alice", 20), ("Jack", 30);
Query OK, 3 rows affected (0.09 sec)
{'label':'label_183babcb84ad4023_a2d6266ab73fb5aa', 'status':'VISIBLE', 'txnId':'7'}mysql> select * from tbl order by id;
+------+-------+-------+
| id   | name  | value |
+------+-------+-------+
|    1 | Bob   |    10 |
|    2 | Alice |    20 |
|    3 | Jack  |    30 |
+------+-------+-------+
3 rows in set (0.05 sec)

类似地,使用流加载导入文件test.csv而不指定自动递增列id将导致id列被自动填充生成的值。

Tom, 40
John, 50
curl --location-trusted -u user:passwd -H "columns:name,value" -H "column_separator:," -T ./test1.csv http://{host}:{port}/api/{db}/tbl/_stream_load
mysql> select * from tbl order by id;
+------+-------+-------+
| id   | name  | value |
+------+-------+-------+
|    1 | Bob   |    10 |
|    2 | Alice |    20 |
|    3 | Jack  |    30 |
|    4 | Tom   |    40 |
|    5 | John  |    50 |
+------+-------+-------+
5 rows in set (0.04 sec)

在指定自动递增列id的同时使用insert into语句导入时,为该列导入的数据中的空值将被生成的值替换。

mysql> insert into tbl(id, name, value) values(null, "Doris", 60), (null, "Nereids", 70);
Query OK, 2 rows affected (0.07 sec)
{'label':'label_9cb0c01db1a0402c_a2b8b44c11ce4703', 'status':'VISIBLE', 'txnId':'10'}mysql> select * from tbl order by id;
+------+---------+-------+
| id   | name    | value |
+------+---------+-------+
|    1 | Bob     |    10 |
|    2 | Alice   |    20 |
|    3 | Jack    |    30 |
|    4 | Tom     |    40 |
|    5 | John    |    50 |
|    6 | Doris   |    60 |
|    7 | Nereids |    70 |
+------+---------+-------+
7 rows in set (0.04 sec)

3.2 部分更新

当对包含自动递增列的merge-on-write Unique表执行部分更新时:

如果自动递增列是键列,则在部分更新期间,由于用户必须显式指定键列,因此部分列更新的目标列必须包括自动递增列。在这个场景中,导入行为类似于常规的部分更新。

mysql> CREATE TABLE `demo`.`tbl2` (->     `id` BIGINT NOT NULL AUTO_INCREMENT,->     `name` varchar(65533) NOT NULL,->     `value` int(11) NOT NULL DEFAULT "0"-> ) ENGINE=OLAP-> UNIQUE KEY(`id`)-> DISTRIBUTED BY HASH(`id`) BUCKETS 10-> PROPERTIES (-> "replication_allocation" = "tag.location.default: 3",-> "enable_unique_key_merge_on_write" = "true"-> );
Query OK, 0 rows affected (0.03 sec)mysql> insert into tbl2(id, name, value) values(1, "Bob", 10), (2, "Alice", 20), (3, "Jack", 30);
Query OK, 3 rows affected (0.14 sec)
{'label':'label_5538549c866240b6_bce75ef323ac22a0', 'status':'VISIBLE', 'txnId':'1004'}mysql> select * from tbl2 order by id;
+------+-------+-------+
| id   | name  | value |
+------+-------+-------+
|    1 | Bob   |    10 |
|    2 | Alice |    20 |
|    3 | Jack  |    30 |
+------+-------+-------+
3 rows in set (0.08 sec)mysql> set enable_unique_key_partial_update=true;
Query OK, 0 rows affected (0.01 sec)mysql> set enable_insert_strict=false;
Query OK, 0 rows affected (0.00 sec)mysql> insert into tbl2(id, name) values(1, "modified"), (4, "added");
Query OK, 2 rows affected (0.06 sec)
{'label':'label_3e68324cfd87457d_a6166cc0a878cfdc', 'status':'VISIBLE', 'txnId':'1005'}mysql> select * from tbl2 order by id;
+------+----------+-------+
| id   | name     | value |
+------+----------+-------+
|    1 | modified |    10 |
|    2 | Alice    |    20 |
|    3 | Jack     |    30 |
|    4 | added    |     0 |
+------+----------+-------+
4 rows in set (0.04 sec)

当自动递增列是非键列,并且用户没有为自动递增列指定值时,将从表中的现有数据行填充该值。如果用户指定自动递增列,则该列的导入数据中的空值将被生成的值替换,而非空值将保持不变,然后这些数据将加载部分更新的语义。

mysql> CREATE TABLE `demo`.`tbl3` (->     `id` BIGINT NOT NULL,->     `name` varchar(100) NOT NULL,->     `score` BIGINT NOT NULL,->     `aid` BIGINT NOT NULL AUTO_INCREMENT-> ) ENGINE=OLAP-> UNIQUE KEY(`id`)-> DISTRIBUTED BY HASH(`id`) BUCKETS 1-> PROPERTIES (-> "replication_allocation" = "tag.location.default: 3",-> "enable_unique_key_merge_on_write" = "true"-> );
Query OK, 0 rows affected (0.16 sec)mysql> insert into tbl3(id, name, score) values(1, "Doris", 100), (2, "Nereids", 200), (3, "Bob", 300);
Query OK, 3 rows affected (0.28 sec)
{'label':'label_c52b2c246e244dda_9b91ee5e27a31f9b', 'status':'VISIBLE', 'txnId':'2003'}mysql> select * from tbl3 order by id;
+------+---------+-------+------+
| id   | name    | score | aid  |
+------+---------+-------+------+
|    1 | Doris   |   100 |    0 |
|    2 | Nereids |   200 |    1 |
|    3 | Bob     |   300 |    2 |
+------+---------+-------+------+
3 rows in set (0.13 sec)mysql> set enable_unique_key_partial_update=true;
Query OK, 0 rows affected (0.00 sec)mysql> set enable_insert_strict=false;
Query OK, 0 rows affected (0.00 sec)mysql> insert into tbl3(id, score) values(1, 999), (2, 888);
Query OK, 2 rows affected (0.07 sec)
{'label':'label_dfec927d7a4343ca_9f9ade581391de97', 'status':'VISIBLE', 'txnId':'2004'}mysql> select * from tbl3 order by id;
+------+---------+-------+------+
| id   | name    | score | aid  |
+------+---------+-------+------+
|    1 | Doris   |   999 |    0 |
|    2 | Nereids |   888 |    1 |
|    3 | Bob     |   300 |    2 |
+------+---------+-------+------+
3 rows in set (0.06 sec)mysql> insert into tbl3(id, aid) values(1, 1000), (3, 500);
Query OK, 2 rows affected (0.07 sec)
{'label':'label_b26012959f714f60_abe23c87a06aa0bf', 'status':'VISIBLE', 'txnId':'2005'}mysql> select * from tbl3 order by id;
+------+---------+-------+------+
| id   | name    | score | aid  |
+------+---------+-------+------+
|    1 | Doris   |   999 | 1000 |
|    2 | Nereids |   888 |    1 |
|    3 | Bob     |   300 |  500 |
+------+---------+-------+------+
3 rows in set (0.06 sec)

4、使用场景

4.1 字典编码

在用户配置文件中使用位图进行受众分析需要构建一个用户字典,其中每个用户对应一个唯一的整数字典值。聚合这些字典值可以提高位图的性能。

以线下UV、PV分析场景为例,假设有详细的用户行为表:

CREATE TABLE `demo`.`dwd_dup_tbl` (`user_id` varchar(50) NOT NULL,`dim1` varchar(50) NOT NULL,`dim2` varchar(50) NOT NULL,`dim3` varchar(50) NOT NULL,`dim4` varchar(50) NOT NULL,`dim5` varchar(50) NOT NULL,`visit_time` DATE NOT NULL
) ENGINE=OLAP
DUPLICATE KEY(`user_id`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 32
PROPERTIES (
"replication_allocation" = "tag.location.default: 3"
);

使用auto-increment列创建如下字典表:

CREATE TABLE `demo`.`dictionary_tbl` (`user_id` varchar(50) NOT NULL,`aid` BIGINT NOT NULL AUTO_INCREMENT
) ENGINE=OLAP
UNIQUE KEY(`user_id`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 32
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"enable_unique_key_merge_on_write" = "true"
);

从已有数据中导入user_id的值到字典表中,建立user_id到整数值的映射:

insert into dictionary_tbl(user_id)
select user_id from dwd_dup_tbl group by user_id;

或者只将增量数据中的user_id的值导入字典表:

insert into dictionary_tbl(user_id)
select dwd_dup_tbl.user_id from dwd_dup_tbl left join dictionary_tbl
on dwd_dup_tbl.user_id = dictionary_tbl.user_id where dwd_dup_tbl.visit_time > '2023-12-10' and dictionary_tbl.user_id is NULL;

在实际场景中,Flink连接器也可用于将数据写入Doris

假设dim1dim3dim5表示我们感兴趣的统计维度,创建以下表来存储聚合结果:

CREATE TABLE `demo`.`dws_agg_tbl` (`dim1` varchar(50) NOT NULL,`dim3` varchar(50) NOT NULL,`dim5` varchar(50) NOT NULL,`user_id_bitmap` BITMAP BITMAP_UNION NOT NULL,`pv` BIGINT SUM NOT NULL 
) ENGINE=OLAP
AGGREGATE KEY(`dim1`,`dim3`,`dim5`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 32
PROPERTIES (
"replication_allocation" = "tag.location.default: 3"
);

将数据聚合操作的结果存储到聚合结果表中:

insert into dws_agg_tbl
select dwd_dup_tbl.dim1, dwd_dup_tbl.dim3, dwd_dup_tbl.dim5, BITMAP_UNION(TO_BITMAP(dictionary_tbl.aid)), COUNT(1)
from dwd_dup_tbl INNER JOIN dictionary_tbl on dwd_dup_tbl.user_id = dictionary_tbl.user_id;

使用以下语句执行UV和PV查询:

select dim1, dim3, dim5, user_id_bitmap as uv, pv from dws_agg_tbl;

高效分页

在页面上显示数据时,通常需要分页。传统的分页通常涉及在SQL查询中使用limitoffsetorder by。例如,考虑下面要显示的业务表:

CREATE TABLE `demo`.`records_tbl` (`key` int(11) NOT NULL COMMENT "",`name` varchar(26) NOT NULL COMMENT "",`address` varchar(41) NOT NULL COMMENT "",`city` varchar(11) NOT NULL COMMENT "",`nation` varchar(16) NOT NULL COMMENT "",`region` varchar(13) NOT NULL COMMENT "",`phone` varchar(16) NOT NULL COMMENT "",`mktsegment` varchar(11) NOT NULL COMMENT ""
) DUPLICATE KEY (`key`, `name`)
DISTRIBUTED BY HASH(`key`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 3"
);

假设分页中每页显示100条记录。要获取第一页的数据,可以使用以下SQL查询:

select * from records_tbl order by `key`, `name` limit 100;

获取第二页的数据可以通过以下方式完成:

select * from records_tbl order by `key`, `name` limit 100, offset 100;

但是,在执行深度分页查询(具有较大偏移量)时,即使实际所需的数据行很少,该方法仍然会将所有数据读入内存中进行完整排序,然后再进行后续处理,这是非常低效的。使用自动递增列会为每行分配一个唯一值,从而允许使用where unique_value > x limit y预先过滤大量数据,从而提高分页效率

继续前面提到的业务表,向表中添加一个自动递增列,为每一行提供唯一标识符:

CREATE TABLE `demo`.`records_tbl2` (`key` int(11) NOT NULL COMMENT "",`name` varchar(26) NOT NULL COMMENT "",`address` varchar(41) NOT NULL COMMENT "",`city` varchar(11) NOT NULL COMMENT "",`nation` varchar(16) NOT NULL COMMENT "",`region` varchar(13) NOT NULL COMMENT "",`phone` varchar(16) NOT NULL COMMENT "",`mktsegment` varchar(11) NOT NULL COMMENT "",`unique_value` BIGINT NOT NULL AUTO_INCREMENT
) DUPLICATE KEY (`key`, `name`)
DISTRIBUTED BY HASH(`key`) BUCKETS 10
PROPERTIES ("replication_num" = "3"
);

对于每页显示100条记录的分页,要获取第一页的数据,可以使用以下SQL查询:

select * from records_tbl2 order by unique_value limit 100;

通过记录返回结果中的unique_value的最大值,我们假设它是99。下面的查询可以获取第二页的数据:

select * from records_tbl2 where unique_value > 99 order by unique_value limit 100;

如果直接查询后一页的内容,不方便直接从前一页的数据中获取unique_value的最大值(例如直接获取第101页的内容),可以使用以下查询:

select key, name, address, city, nation, region, phone, mktsegment
from records_tbl2, (select unique_value as max_value from records_tbl2 order by unique_value limit 1 offset 9999) as previous_data
where records_tbl2.unique_value > previous_data.max_value
order by records_tbl2.unique_value limit 100;

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

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

相关文章

【echarts】如何制作,横坐标每个日期点如何对应一条竖线的图,以及 markline设置后不生效问题

图的样式如下: 在线演示 每一个日期,对应一条竖线展示。 echarts配置内容: 在线演示 option {xAxis: {type: category,data: [20240601, 20240602, 20240603, 20240604, 20240605, 20240606, 20240607] // X轴数据},yAxis: {type: valu…

HTML label 标签的作用和应用场景

label 标签 作用和语法 label 标签来定义表单控制间的关系&#xff0c;当用户点击该标签时&#xff0c;浏览器会自动将焦点转到和标签相关的表单控件上。 <label for"Name">Number:</label> <input type“text“ name"Name" id"Name…

【leetcode--判断子序列】

写了一版&#xff0c;发现这个记录的顺序不对&#xff0c;又去调试才看出来的&#xff0c;逻辑写错了&#xff0c;最近脑子真的不转。。。 class Solution:def isSubsequence(self, s: str, t: str) -> bool:r []for i in range(len(s)):if s[i] not in t:return Falseels…

Linux学习—Linux安全与防火墙

Linux安全基础 用户账户安全 强密码策略&#xff1a;确保所有用户使用强密码。最小权限原则&#xff1a;仅授予用户完成任务所需的最小权限。 定期更新系统 软件包更新&#xff1a;定期使用包管理器更新系统软件包&#xff0c;以修复安全漏洞。 sudo apt update &&…

MTK联发科MT6897(天玑8300)5G智能移动处理器规格参数

天玑 8300 采用台积电第二代 4nm 制程&#xff0c;基于 Armv9 CPU 架构&#xff0c;八核 CPU 包含 4 个 Cortex-A715 性能核心和 4 个 Cortex-A510 能效核心&#xff0c;CPU 峰值性能较上一代提升 20%&#xff0c;功耗节省 30%。 此外&#xff0c;天玑 8300 搭载 6 核 GPU Mal…

从零开始手把手Vue3+TypeScript+ElementPlus管理后台项目实战七(axios请求头带上token)

本系列项目教程最终演示效果如下&#xff1a; 管理后台在线演示 上节遗留问题 上一节我们看到&#xff0c;页面刷新时&#xff0c;store中的数据丢失。表现在页面上是只要我们刷新页面&#xff0c;当前登录的用户名就丢失。这对使用系统的用户不是十分友好。另外&#xff0c…

uniapp原生插件开发实战——集成Android端的Twitter登陆

Android集成Twitter登陆的官方教程:https://github.com/twitter-archive/twitter-kit-android/wiki 项目创建 首先可以先看下uniapp原生插件开发教程 uniapp原生插件类型分为两种: Module模式:能力扩展,无嵌入窗体的UI控件,类似于功能插件。Component模式:在窗体中内嵌…

自然语言处理:第三十三章FILCO:过滤内容的RAG

文章链接: [2311.08377] Learning to Filter Context for Retrieval-Augmented Generation (arxiv.org) 项目地址: zorazrw/filco: [Preprint] Learning to Filter Context for Retrieval-Augmented Generaton (github.com) 在人工智能领域&#xff0c;尤其是在开放域问答和事…

Go微服务: 关于TCC分布式事务

TCC 分布式事务 T: Try 预处理, 尝试执行&#xff0c;完成所有的业务检查&#xff0c;做好一致性&#xff0c;预留必要的业务资源&#xff0c;做好准隔离性C: Confirm 确认&#xff0c;如果所有的分支Try都成功了, 就到了这个阶段, Confirm 是真正执行业务的过程, 不做任何业务…

【多模态】37、TextSquare | 借助 Gemini-Pro 通过四个步骤来生成高质量的文本问答数据

文章目录 一、背景二、方法2.1 Square-10M2.2 模型结构2.3 使用 Square-10M 进行有监督微调 三、效果3.1 实验设置3.2 Benchmark 测评 论文&#xff1a;TextSquare: Scaling up Text-Centric Visual Instruction Tuning 代码&#xff1a;暂无 出处&#xff1a;字节 | 华中科技…

linux 服务器上离线安装 node nvm

因为是离线环境 如果你是可以访问外网的 下面内容仅供参考 也可以继续按步骤来 node 安装路径 Node.js — Download Node.js nvm 安装路径 Tags nvm-sh/nvm GitHub 后来发现 nvm安装后 nvm use 版本号 报错 让我去nvm install 版本 我是内网环境 install不了 下面 你要 把安…

玄机平台应急响应—apache日志分析

1、前言 apache的日志一共有两个&#xff0c;一个是access.log&#xff0c;这个日志记录了所有对Web服务器的访问&#xff0c;被入侵时重点排查这个。另一个是error.log&#xff0c;错误日志记录了服务器运行期间遇到的各种错误&#xff0c;以及一些普通的诊断信息&#xff0c…

【Python】推荐比print更好用的调试方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【Vue】作用域插槽

插槽分类 默认插槽&#xff1a;组件内定制一处结构 具名插槽&#xff1a;组件内定制多处结构 插槽只有两种&#xff0c;作用域插槽不属于插槽的一种分类。作用域插槽只是插槽的一个传参语法 作用&#xff1a; 定义slot 插槽的同时, 是可以传值的。给 插槽 上可以 绑定数据&a…

LeetCode 算法:滑动窗口最大值c++

原题链接&#x1f517;&#xff1a;滑动窗口最大值 难度&#xff1a;困难⭐️⭐️⭐️ 题目 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动…

Python 树状数组

树状数组&#xff08;Binary Indexed Tree, BIT&#xff09;&#xff0c;又称为斐波那契堆&#xff0c;是一种数据结构&#xff0c;用于高效地解决以下问题&#xff1a; 单点更新&#xff1a;在数组的某个位置增加或减少一个值。区间查询&#xff1a;查询数组中一段连续区间的…

Skins

本主题解释如何将DevExpress主题/皮肤应用到应用程序中&#xff0c;如何允许用户在运行时在主题之间切换&#xff0c;如何自定义现有皮肤或创建自己的皮肤&#xff0c;等等。 WinForms订阅包括许多基本控件&#xff1a;按钮、复选框、表单、消息框、对话框、对话框等。 我们实现…

MFC 使用sapi文字转换为语音

文章目录 添加头文件声明变量 添加头文件 声明变量 pSpVoice NULL; //默认构造函数中初始化为空 bool CChKBarSCCodeApp::InitSpVoice() {HRESULT hr ::CoInitialize(NULL); // COM初始化if (!SUCCEEDED(hr)){AfxMessageBox(_T("声音环境初始化失败&#xff01;…

自定义模块设置示例

CSDN 针对部分博主开放了自定义模块设置&#xff0c;我也是简单的使用了一下这个功能&#xff0c;感觉很不错&#xff0c;下面是我编写的参考代码大家可以复制下面代码来使自己的博客主页多样化。 <div class"pmusic"><iframe frameborder"no" bo…

Uncaught ReferenceError : Vue is not defined异常的解决方案

Uncaught ReferenceError: Vue is not defined 异常是 JavaScript 开发中常见的错误之一&#xff0c;特别是在使用 Vue.js 框架时。这个异常意味着在代码尝试访问 Vue 对象时&#xff0c;浏览器环境中没有找到 Vue 的定义。这通常是由于 Vue 库没有正确加载或引入导致的。 文章…