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

MySQL DDL语法

MySQL DDL语法

DDL简介

MySQL DDL(Data Definition Language)是用于定义和管理数据库结构的语言。它包括创建、修改和删除数据库、表、视图、索引和其他数据库对象的语句。DDL语法的重要性如下:

  1. 数据库结构定义:DDL语句用于创建和定义数据库对象的结构,例如创建表和定义字段、数据类型、约束和索引等。正确定义数据库结构是确保数据完整性和一致性的基础。

  2. 数据库对象管理:DDL语句可以修改和删除数据库对象。通过DDL语句,可以修改表结构、添加或删除字段、约束和索引。这样可以根据业务需求灵活地管理和调整数据库结构,以适应不断变化的数据管理需求。

  3. 数据库安全和权限控制:DDL语句用于管理数据库用户的权限和访问控制。通过DDL语句,可以创建和管理用户、分配和收回权限,确保数据库的安全性和数据保护。

  4. 数据库性能优化:DDL语句可以优化数据库的性能。通过正确的表设计、索引创建和优化的DDL语句,可以提高查询性能、减少存储空间占用,并优化数据的读写操作。

  5. 数据库版本控制和迁移:DDL语句记录了数据库结构的变化。通过版本控制工具,可以将DDL语句存储为脚本,方便进行数据库结构的版本管理和迁移,确保不同环境下数据库的一致性和可追溯性。

总之,DDL语法在MySQL中的重要性体现在它定义、管理和调整数据库结构、维护数据库安全性、优化数据库性能以及支持数据库版本控制和迁移。正确使用和理解DDL语句对于数据库管理与开发人员来说至关重要,它们需要合理规划和维护数据库结构,确保数据的存储、访问和更新的准确性、高效性和安全性。

DDL语法分类

DDL(Data Definition Language)语法主要包括以下几个方面的分类:

  1. 创建数据库对象:

    • CREATE DATABASE:创建数据库。
    • CREATE TABLE:创建表。
    • CREATE INDEX:创建索引。
    • CREATE VIEW:创建视图。
    • CREATE TRIGGER:创建触发器。
  2. 修改数据库对象:

    1. ALTER {ADD|MODIFY|REMOVE|RENAME|CHANGE}
    2. ALTER TABLE:修改表结构,如添加、修改和删除列、约束等。
    3. ALTER INDEX:修改索引。
    4. ALTER VIEW:修改视图。
    5. ALTER TRIGGER:修改触发器。
  3. 删除数据库对象:

    • DROP DATABASE:删除数据库。
    • DROP TABLE:删除表。
    • DROP INDEX:删除索引。
    • DROP VIEW:删除视图。
    • DROP TRIGGER:删除触发器。

这些是常见的DDL语法分类。根据不同的语法分类,可以执行不同的操作,如创建和修改数据库对象、管理权限、事务管理等。了解和熟悉DDL语法的分类有助于更好地使用和管理数据库对象,并实现数据定义和管理的目标。

DDL 语句原型

创建数据库对象的DDL语法具体如下:

  1. CREATE DATABASE:创建数据库

    • 语法原型:
    CREATE DATABASE [IF NOT EXISTS] database_name
    [CHARACTER SET charset_name]
    [COLLATE collation_name]
    
    • 参数说明:
      • database_name:要创建的数据库的名称。
      • IF NOT EXISTS(可选):如果指定的数据库已经存在,则不执行任何操作。
      • CHARACTER SET charset_name(可选):指定数据库的字符集(例如utf8)。
      • COLLATE collation_name(可选):指定数据库的校对规则。
  2. CREATE TABLE:创建表

    • 语法原型:
    CREATE TABLE table_name
    (column1 datatype constraints,column2 datatype constraints,...
    )
    [ENGINE = engine_name]
    [DEFAULT CHARACTER SET charset_name]
    [COLLATE collation_name]
    
    • 参数说明:
      • table_name:要创建的表的名称。
      • column1, column2, ...:表的列定义,包括列名、数据类型和相关约束。
      • ENGINE = engine_name(可选):指定要使用的存储引擎(例如InnoDB)。
      • DEFAULT CHARACTER SET charset_name(可选):指定表的默认字符集。
      • COLLATE collation_name(可选):指定表的默认校对规则。
  3. CREATE INDEX:创建索引

    • 语法原型:
    CREATE INDEX index_name
    ON table_name (column1, column2, ...)
    
    • 参数说明:
      • index_name:要创建的索引的名称。
      • table_name:在哪个表上创建索引。
      • column1, column2, ...:要包含在索引中的列。
  4. CREATE VIEW:创建视图

    • 语法原型:
    CREATE VIEW view_name AS
    SELECT column1, column2, ...
    FROM table_name
    WHERE condition
    
    • 参数说明:
      • view_name:要创建的视图的名称。
      • column1, column2, ...:视图中包含的列。
      • table_name:从哪个表选择数据。
      • WHERE condition(可选):限制选择的条件。
  5. CREATE TRIGGER:创建触发器

    • 语法原型:
    CREATE TRIGGER trigger_name
    {BEFORE | AFTER} {INSERT | UPDATE | DELETE}
    ON table_name
    FOR EACH ROW
    BEGIN-- 触发器的操作逻辑
    END;
    
    • 参数说明:
      • trigger_name:要创建的触发器的名称。
      • {BEFORE | AFTER}:指定触发器在相关事件之前或之后执行。
      • {INSERT | UPDATE | DELETE}:指定触发器与哪个操作相关。
      • table_name:与触发器相关的表。
      • FOR EACH ROW:每行触发。

以上是创建数据库对象的DDL语法和参数说明。根据具体的需求和逻辑,使用适当的语法可以创建数据库、表、索引、视图和触发器等对象,并定义其属性和行为。

修改数据库对象:

  • 修改数据库对象的相关语法如下:

    1. ALTER {ADD|MODIFY|REMOVE|RENAME|CHANGE}:
    • ALTER ADD:

      • 语法原型:ALTER TABLE table_name ADD column_name datatype [constraints];
      • 参数说明:
        • table_name:要修改的表名。
        • column_name:要添加的列名称。
        • datatype:列的数据类型。
        • [constraints]:列的约束条件,如NOT NULL、DEFAULT等。
      • 含义:在已存在的表中添加新的列。
    • ALTER MODIFY:

      • 语法原型:ALTER TABLE table_name MODIFY column_name datatype [constraints];
      • 参数说明:
        • table_name:要修改的表名。
        • column_name:要修改的列名称。
        • datatype:列的新数据类型。
        • [constraints]:列的约束条件,如NOT NULL、DEFAULT等。
      • 含义:修改已存在表中列的数据类型。
    • ALTER REMOVE:

      • 语法原型:ALTER TABLE table_name DROP column_name;
      • 参数说明:
        • table_name:要修改的表名。
        • column_name:要删除的列名称。
      • 含义:从已存在的表中删除指定的列。
    • ALTER RENAME:

      • 语法原型:ALTER TABLE table_name RENAME old_column_name TO new_column_name;
      • 参数说明:
        • table_name:要修改的表名。
        • old_column_name:原列名称。
        • new_column_name:新列名称。
      • 含义:修改已存在的表中的列名。
    • ALTER CHANGE:

      • 语法原型:ALTER TABLE table_name CHANGE old_column_name new_column_name datatype [constraints];
      • 参数说明:
        • table_name:要修改的表名。
        • old_column_name:原列名称。
        • new_column_name:新列名称。
        • datatype:列的数据类型。
        • [constraints]:列的约束条件,如NOT NULL、DEFAULT等。
      • 含义:修改已存在的表中的列名,并可同时更改列的数据类型和约束条件。
    1. ALTER TABLE:用于修改表结构,如添加、修改和删除列、约束等。
    • 语法原型:ALTER TABLE table_name {ADD|MODIFY|DROP} column_name datatype [constraints];
    • 参数说明:
      • table_name:要修改的表名。
      • ADD:添加列。
      • MODIFY:修改列的数据类型。
      • DROP:删除列。
      • column_name:要添加、修改或删除的列名称。
      • datatype:列的数据类型。
      • [constraints]:列的约束条件,如NOT NULL、DEFAULT等。
    • 含义:通过 ALTER TABLE 语句可以添加、修改和删除表的列。
    1. ALTER INDEX:修改索引。
    • 语法原型:ALTER TABLE table_name ALTER INDEX index_name {RENAME TO new_index_name | SET index_type};
    • 参数说明:
      • table_name:要修改的表名。
      • index_name:要修改的索引名称。
      • RENAME TO new_index_name:修改索引名称。
      • SET index_type:修改索引类型。
    • 含义:通过 ALTER INDEX 语句可以修改表的索引,可以修改索引的名称或类型。
    1. ALTER VIEW:修改视图。
    • 语法原型:ALTER VIEW view_name AS new_view_definition;
    • 参数说明:
      • view_name:要修改的视图名称。
      • new_view_definition:新的视图定义。
    • 含义:通过 ALTER VIEW 语句可以修改视图的定义,可以更新视图的查询逻辑。
    1. ALTER TRIGGER:修改触发器。
    • 语法原型:ALTER TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name FOR EACH ROW BEGIN ... END;
    • 参数说明:
      • trigger_name:要修改的触发器名称。
      • {BEFORE | AFTER}:触发器的触发时机(在相关事件之前或之后)。
      • {INSERT | UPDATE | DELETE}:触发器与哪个操作相关。
      • table_name:触发器关联的表名。
      • BEGIN ... END:修改触发器的操作逻辑。
    • 含义:通过 ALTER TRIGGER 语句可以修改触发器的定义和操作逻辑。

删除数据库对象的相关语法

  1. DROP DATABASE:删除数据库。

    • 语法原型:DROP DATABASE database_name;
    • 参数说明:
      • database_name:要删除的数据库名称。
    • 含义:该语句用于永久删除指定的数据库及其所有关联的表、视图、索引和触发器等数据对象。
  2. DROP TABLE:删除表。

    • 语法原型:DROP TABLE table_name;
    • 参数说明:
      • table_name:要删除的表名称。
    • 含义:该语句用于永久删除指定的表及其所有的数据和约束等对象。
  3. DROP INDEX:删除索引。

    • 语法原型:DROP INDEX index_name ON table_name;
    • 参数说明:
      • index_name:要删除的索引名称。
      • table_name:索引所属的表名称。
    • 含义:该语句用于永久删除指定表中的索引。
  4. DROP VIEW:删除视图。

    • 语法原型:DROP VIEW view_name;
    • 参数说明:
      • view_name:要删除的视图名称。
    • 含义:该语句用于永久删除指定的视图。
  5. DROP TRIGGER:删除触发器。

    • 语法原型:DROP TRIGGER trigger_name ON table_name;
    • 参数说明:
      • trigger_name:要删除的触发器名称。
      • table_name:触发器所属的表名称。
    • 含义:该语句用于永久删除指定的触发器。

DDL语句规范

  1. 关键字的大小写:与之前提到的一样,SQL中的关键字通常以大写表示,建议将DDL语句中的关键字统一为大写,以增加可读性。
  2. 标识符的命名规范:同样,命名DDL语句中的数据库对象时,应遵循一定的命名规范,使用有意义的、描述性的名称,并避免使用保留字或特殊字符,以免造成语法错误。此规则适用于DDL中的CREATE、ALTER和DROP语句等。
  3. 缩进和换行:为提高可读性,应使用适当的缩进和换行,对DDL语句进行分组和对齐。例如,在CREATE TABLE语句中,使用缩进将列定义对齐,使代码结构清晰。
  4. 注释的使用:在DDL语句中加入注释,以对代码进行解释和说明,以增加代码的可读性。注释应该清晰明了,描述主要操作和目的。
  5. 错误处理和回滚:在执行DDL语句之前,应考虑异常处理机制,例如使用TRY-CATCH块,以处理潜在的错误情况,并根据需要执行回滚操作。
  6. 安全性和权限:在DDL语句中涉及到数据库对象的创建、修改和删除时,要确保只有授权的用户才能执行这些操作,并进行必要的权限控制,以保证数据的安全性。

DDL SQL注入方法

DDL(Data Definition Language)SQL注入是指攻击者通过在应用程序的用户输入中注入恶意的DDL SQL代码,来执行未经授权的数据库结构修改操作。与DML SQL注入不同,DDL SQL注入攻击的目标是修改数据库的结构而不是数据的内容。以下是一些常见的DDL SQL注入方法:

  1. 删除表注入:攻击者通过在DROP TABLE语句中注入恶意的代码,来删除数据库中的表。例如,将输入参数设置为:'; DROP TABLE table_name;–,使得整个表被删除。

  2. 创建表注入:攻击者可以利用CREATE TABLE语句中的注入漏洞,在数据库中创建新的表来进行恶意操作。例如,将输入参数设置为:'); CREATE TABLE malicious_table (id INT);–,会创建一张恶意表。

  3. 修改表注入:攻击者可以在ALTER TABLE语句中注入恶意的代码,来修改数据库表的结构。他们可以添加、删除或修改列、约束等。例如,将输入参数设置为:'; ALTER TABLE table_name ADD COLUMN malicious_column VARCHAR(100);–,将在表中添加一个恶意列。

  4. 注入其他DDL语句:DDL SQL注入可以利用其他的DDL语句来执行未授权的数据库结构修改操作。例如,攻击者可以在应用程序中使用EXECUTE IMMEDIATE或其他动态执行语句的功能,来执行恶意的DDL语句。

防范DDL SQL注入的方法与防范DML SQL注入类似,包括使用参数绑定、输入验证和清理、限制数据库用户权限、日志记录和异常处理等。此外,还应该限制应用程序的数据库操作权限,确保应用程序只能执行合法的DDL操作,并定期进行安全审查和漏洞扫描,以确保应用程序的安全性。

总结

DDL语句是用于定义和管理数据库的结构和对象的语句,包括创建、修改和删除数据库、表、视图、索引等。掌握好DDL语句对于数据库的设计、优化和维护是至关重要的。

相关文章:

MySQL DDL语法

MySQL DDL语法 DDL简介 MySQL DDL(Data Definition Language)是用于定义和管理数据库结构的语言。它包括创建、修改和删除数据库、表、视图、索引和其他数据库对象的语句。DDL语法的重要性如下: 数据库结构定义:DDL语句用于创建…...

Git 绑定账号 和clone

一:环境: 下载安装完成Git,在桌面或文件夹下(在你将要保存代码的位置)右击可以看到Git Bash Here,点击可以进入黑窗口 二:配置公钥 1.查看当前状态(如果已绑定,且知道密码可以登陆,可以直接获取SSH公钥并配置即可拉取代码) git config --list 2.配置全局git用户名和邮箱 …...

ftp和sftp区别,以及xftp的使用

网上找链接找的很辛苦对吧! 网上下载的破解版还不用。而且用没多久又说要更新了,又得重新找。 这下直接把官方免费获取链接发给你,就不用在被这种事情麻烦了。 家庭/学校免费 - NetSarang Website (xshell.com):家庭/学校免费 - NetSarang W…...

C++ 编程入门(一)—— Hello World

C 是什么环境搭建第一个 C 程序本篇结语 C 是什么 C 是一种面向对象的计算机程序设计语言,由美国 AT&T 贝尔实验室的 Bjarne Stroustrup 在 20 世纪 80 年代初期发明并实现(最初这种语言被称作 “C with Classes” 带类的 C 语言)。它是一…...

openlayers系列:加载arcgis和geoserver在线离线切片

https://www.freesion.com/article/1751396517/ 1.背景 有个项目需要使用openlayer加载各种服务上发布的数据,坐标系也不同,我们都知道openalyer默认可以加载EPAG:3857,要加载4490的坐标系的数据需要重新定义一下,之后再加载。一想起要重新…...

《人工智能安全》课程总体结构

1 课程内容 人工智能安全观:人工智能安全问题、安全属性、技术体系等基本问题进行了归纳整理。人工智能安全的主要数据处理方法,即非平衡数据分类、噪声数据处理和小样本学习。人工智能技术赋能网络空间安全攻击与防御:三个典型实例及攻击图…...

unity关于匀速移动某些值的方法

可能很多人会用到Verctor3.Lerp、Mathf.LerpUnclamped等等 这种其实不是匀速 看一下这个整体差不多的逻辑 public static float Lerp(float a, float b, float t){return a (b - a) * t;};这个逻辑就是,从a值到b值,返回一个a值加(b值-a值&…...

解决VScode下载太慢的问题记录

最近突然想重新下载vscoded便携免安装版,发现下载很慢,于是乎查询一下,以便记录 下载地址 VScode官方网站: https://code.visualstudio.com/ 根据个人的需求选择下载,页面加载下载需要等一会, 然后就会…...

Gitlab服务器备份恢复及系统升级

居安思危,思则有备,有备无患。 基于此,申请了一个测试服务器,准备先安装同版本服务器,按照最新的数据进行恢复,然后再将现在的服务器升级到Gitlab的最新版本,记录一下完整的过程,以…...

docker入门讲解

目录 第 1 章 Docker核心概念与安装 为什么使用容器? Docker是什么 Docker设计目标 Docker基本组成 容器 vs 虚拟机 Docker应用场景 Linux 安装 Docker 第 2 章 Docker镜像管理 镜像是什么 镜像从哪里来? 镜像与容器联系 镜像常用管理命令 镜像存储核心技术:联…...

【Matlab】基于卷积神经网络的数据回归预测(Excel可直接替换数据))

【Matlab】基于卷积神经网络的数据回归预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码6.完整代码7.运行结果1.模型原理 基于卷积神经网络(Convolutional Neural Network,CNN)的数据回归预测是一种常见的机器学习方法,适用于处理具有空…...

在Springboot集成Activiti工作流引擎-引入、调用,测试【基础讲解】

工作流 通过计算机对业务流程自动化执行管理 他主要解决的是使在多个参与者之间按照某种“预定义规则”自动进行传递稳定 信息或任务的过程 通俗来讲 业务上一个玩着的审批流程 比如请假,出差 外出采购等 工作流引擎就是来解决流程问题的 提高我们的工作效率 如果…...

Java书签 #解锁MyBatis的4种批量插入方式及ID返回姿势

1. 今日书签 项目开发中,我们经常会用到单条插入和批量插入。但是实际情况可能是,项目初期由于种种原因,在业务各处直接使用单条插入SQL进行开发(未开启批处理),在后面的迭代中,系统性能问题渐…...

在react项目中如何引入国际化

react-i18next 在 React 项目中引入国际化(Internationalization,简称 i18n)可以使用第三方库来实现。其中,最常用且流行的国际化库是 react-i18next,它基于 i18next 实现,提供了方便易用的国际化功能。下…...

spring学习笔记十三

注解实现管理第三方Bean和为第三方Bean注入资源 1、添加pom坐标 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency> 2、SpringConfig配置类 Configuratio…...

react native 本地存储 AsyncStorage

An asynchronous, unencrypted, persistent, key-value storage system for React Native. Async Storage 只能用来储存字符串数据&#xff0c;所以为了去储存object类型的数据&#xff0c;得先进行序列化&#xff08;JSON.stringify()&#xff09;当你想要使用数据的时候&…...

Postgresql数据库中的时间类型汇总

PostgreSQL数据库有以下几种时间类型 1 日期 date&#xff1a;表示日期&#xff0c;格式为YYYY-MM-DD。 2 时间 time&#xff1a;表示时间&#xff0c;格式为HH:MI:SS。 3 日期和时间 timestamp&#xff1a;表示日期和时间&#xff0c;格式为YYYY-MM-DD HH:MI:SS。 4 带…...

算法刷题Day 51 最佳买卖股票时机含冷冻期+买卖股票的最佳时期含手续费

Day 51 动态规划 309. 最佳买卖股票时机含冷冻期 关键是要画出状态转移图 然后根据状态转移图来写状态转移方程 class Solution { public:int maxProfit(vector<int>& prices) {int len prices.size();vector<vector<int>> dp(len, vector<int&g…...

编程导航算法村 第五关 | 白银挑战

编程导航算法村 第五关 | 白银挑战 用栈实现队列 LeetCode 232题 class MyQueue {private Stack<Integer> stack; // 保存private Stack<Integer> tempstack; // 临沭队列public MyQueue() {stack new Stack<>();tempstack new Stack<>();}public…...

(十六十七)时序数据库是怎么存储用户名和密码的从InfluxDB OSS迁移数据

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 16 章 时序数据库是怎么存储用户名和密码的 1、InfluxDB内部自带了一个用Go语言写的BlotDB&#xff0c;Blo…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...