Oracle插入序列值怎么操作_Oracle序列值插入使用教程

答案:Oracle序列用于生成唯一递增主键,通过NEXTVAL插入值,推荐使用NOMAXVALUE、NOCYCLE,根据性能与连续性需求选择CACHE或NOCACHE,并注意CURRVAL需在NEXTVAL后使用,避免序列跳跃、MAXVALUE限制及并发性能问题,同时通过数据字典监控序列状态,合理调整参数以确保系统稳定。

oracle插入序列值怎么操作_oracle序列值插入使用教程

Oracle序列是数据库中一个非常实用的对象,它主要用于生成唯一、递增的数字,通常作为表的主键。要在Oracle中插入序列值,最直接的方式就是在

INSERT

语句中使用序列的

NEXTVAL

伪列。这能确保每次插入操作都能获得一个全新的、不重复的数字,极大地简化了主键管理。

解决方案

要将Oracle序列的值插入到表中,核心操作就是利用序列名后跟

.NEXTVAL

。这个伪列会在每次调用时返回序列的下一个可用值。

我们先来创建一个简单的表和一个序列作为例子:

-- 创建一个序列CREATE SEQUENCE my_id_seq  START WITH 1  INCREMENT BY 1  NOMAXVALUE -- 没有最大值限制  NOCYCLE -- 不循环  CACHE 20; -- 缓存20个值,提高性能-- 创建一个测试表CREATE TABLE my_test_table (  id NUMBER PRIMARY KEY,  name VARCHAR2(100),  created_date DATE DEFAULT SYSDATE);

现在,我们就可以使用

my_id_seq.NEXTVAL

来插入数据了:

-- 第一次插入INSERT INTO my_test_table (id, name) VALUES (my_id_seq.NEXTVAL, '张三');-- 第二次插入INSERT INTO my_test_table (id, name) VALUES (my_id_seq.NEXTVAL, '李四');-- 也可以在SELECT语句中直接获取下一个值,但通常是用于INSERTSELECT my_id_seq.NEXTVAL FROM DUAL;

每次执行

INSERT

语句时,

my_id_seq.NEXTVAL

都会自动从序列中取出一个新的、唯一的数值赋给

id

列。这种方式非常方便,省去了手动管理主键的麻烦。

Oracle序列(Sequence)的创建与基本配置有哪些最佳实践?

创建Oracle序列时,我们不仅仅是写一个

CREATE SEQUENCE

那么简单,理解其背后的参数和它们对系统行为的影响,才能真正做到“最佳实践”。我个人在实际项目中,对这些参数的理解和选择,很大程度上决定了序列在使用中的表现和可能遇到的问题。

一个完整的

CREATE SEQUENCE

语句通常会包含以下关键参数:

CREATE SEQUENCE sequence_name  [INCREMENT BY n]       -- 序列每次递增的步长,默认是1  [START WITH n]         -- 序列的起始值,默认是1  [MAXVALUE n | NOMAXVALUE] -- 序列的最大值,达到后会停止递增或循环(如果设置了CYCLE)。NOMAXVALUE表示没有上限。  [MINVALUE n | NOMINVALUE] -- 序列的最小值,通常用于倒序序列。NOMINVALUE表示没有下限。  [CYCLE | NOCYCLE]      -- 达到MAXVALUE后是否从MINVALUE重新开始循环。NOCYCLE是默认行为,达到MAXVALUE后会报错。  [CACHE n | NOCACHE]    -- 预先在内存中缓存n个序列值。CACHE是默认行为,n通常是20。NOCACHE表示不缓存。  [ORDER | NOORDER];     -- 在RAC(Real Application Clusters)环境中,是否保证序列值的生成顺序与请求顺序一致。NOORDER是默认。

我的几点经验和看法:

START WITH

INCREMENT BY

这两个参数通常根据业务需求来定。如果需要从1开始递增,默认值就很好。但如果需要从某个特定数字开始,或者需要跳跃式递增(比如每次加10),就必须明确指定。

MAXVALUE

NOMAXVALUE

对于主键序列,我通常倾向于使用

NOMAXVALUE

。原因很简单,如果设置了

MAXVALUE

,一旦达到上限,你的应用程序就会因为无法获取新的主键而崩溃。虽然你可以通过

ALTER SEQUENCE

来修改

MAXVALUE

,但这毕竟是事后补救。除非有明确的业务需求限制序列范围,否则,让它自由增长是更稳妥的选择。

CACHE

NOCACHE

的权衡: 这是我个人认为最重要的一个参数。

CACHE n

默认行为,Oracle会预先生成

n

个序列值并存储在内存中。当应用程序请求

NEXTVAL

时,直接从内存中取,速度非常快,极大地提高了并发性能。但缺点是,如果数据库实例重启,或者缓存中的值没有被完全使用就发生了系统故障,那么这些未使用的缓存值就会丢失,导致序列号出现“跳跃”或“不连续”。在大多数业务场景下,主键的连续性并非强制要求,因此

CACHE

是首选。

NOCACHE

每次请求

NEXTVAL

时,Oracle都会去数据字典中查询并更新序列的当前值。这保证了序列的严格连续性(除非事务回滚),但代价是性能下降,因为每次操作都涉及I/O。对于那些对序列号连续性有严格要求的场景(例如某些审计日志编号),

NOCACHE

是必须的,但要做好性能牺牲的准备。

CYCLE

NOCYCLE

同样,对于主键序列,我几乎总是用

NOCYCLE

。让主键循环使用是一个非常危险的行为,极易导致主键冲突。除非你是在一个非常特殊的、需要循环利用ID的场景(比如一些临时的、非持久化的ID生成),否则请务必使用

NOCYCLE

ORDER

NOORDER

这个参数主要影响RAC环境。

NOORDER

是默认值,它允许不同RAC节点独立缓存序列值,以提高性能,但不能保证序列值的生成顺序与请求顺序完全一致(例如,节点A请求的序列值可能比节点B请求的序列值晚生成但数值更小)。

ORDER

则会强制序列值按请求顺序生成,代价是性能开销。在单实例环境中,这个参数没有实际意义。在RAC中,除非业务对序列值的严格顺序有要求(比如时间戳相关的审计),否则通常使用

NOORDER

以获得更好的性能。

总结来说,对于大多数作为主键的序列,我的推荐是:

NOMAXVALUE

NOCYCLE

,并且根据对连续性和性能的权衡选择

CACHE

NOCACHE

除了NEXTVAL,Oracle序列还有哪些高级用法或常见陷阱需要注意?

除了最常用的

NEXTVAL

,Oracle序列还有一些其他用法,以及在使用过程中可能遇到的一些陷阱,这些都是我在实际开发和维护中反复踩坑后总结出来的。

1.

CURRVAL

的使用与限制

CURRVAL

伪列用于获取当前会话中序列的最新值。但这里有一个非常重要的限制:在当前会话中,必须先调用过一次

NEXTVAL

,才能使用

CURRVAL

如果在调用

NEXTVAL

之前就尝试使用

CURRVAL

,Oracle会抛出

ORA-08002: sequence sequence_name.CURRVAL is not yet defined in this session

的错误。

典型应用场景:当你需要在一个事务中,多次引用同一个序列值时,

CURRVAL

就派上用场了。例如,你插入了一个主表记录,其ID由序列生成,然后需要在子表记录中引用这个主表的ID。

-- 假设我们有一个订单表和订单明细表-- 先插入订单主表,获取订单IDINSERT INTO orders (order_id, customer_id, order_date)VALUES (order_seq.NEXTVAL, 101, SYSDATE);-- 然后获取刚刚生成的订单ID,插入订单明细表INSERT INTO order_items (item_id, order_id, product_id, quantity)VALUES (item_seq.NEXTVAL, order_seq.CURRVAL, 201, 2);INSERT INTO order_items (item_id, order_id, product_id, quantity)VALUES (item_seq.NEXTVAL, order_seq.CURRVAL, 203, 1);

这样就避免了多次调用

NEXTVAL

导致订单ID不一致的问题。

2. 在

SELECT

语句中获取序列值

虽然主要用于

INSERT

,但你也可以在

SELECT

语句中获取序列的

NEXTVAL

CURRVAL

。这通常用于测试,或者在PL/SQL块中需要预先获取一个序列值进行逻辑判断的场景。

Replit Ghostwrite Replit Ghostwrite

一种基于 ML 的工具,可提供代码完成、生成、转换和编辑器内搜索功能。

Replit Ghostwrite 93 查看详情 Replit Ghostwrite

-- 获取下一个序列值SELECT my_id_seq.NEXTVAL FROM DUAL;-- 获取当前序列值(前提是当前会话已调用过NEXTVAL)SELECT my_id_seq.CURRVAL FROM DUAL;

3. 序列的常见陷阱与挑战

序列号跳跃(Gaps in Sequences):这是最常见的问题,尤其在使用

CACHE

选项时。当数据库实例重启,或者缓存中的序列值没有被完全使用就发生故障(如进程终止、事务回滚),这些未使用的值就会丢失,导致序列号不连续。此外,如果一个事务获取了

NEXTVAL

但最终回滚了,那个序列值也一样被“消耗”掉了,不会被退回,同样造成跳跃。虽然这对于主键通常不是问题,但如果业务对连续性有严格要求,就必须使用

NOCACHE

并接受性能下降的代价。

CURRVAL

未定义错误:前面已经提到,这是初学者常犯的错误。记住,

CURRVAL

必须在

NEXTVAL

之后才能使用。

达到

MAXVALUE

如果序列设置了

MAXVALUE

且是

NOCYCLE

,一旦达到最大值,任何尝试获取

NEXTVAL

的操作都会报错(

ORA-08004: sequence sequence_name.NEXTVAL exceeds MAXVALUE and cannot be instantiated

)。这会导致应用程序停止工作。因此,对于长期使用的序列,我个人强烈建议使用

NOMAXVALUE

重置序列的复杂性:Oracle没有提供一个简单的

ALTER SEQUENCE RESET

命令。如果你想将一个序列重置回某个起始值,通常的做法是:

DROP SEQUENCE sequence_name;
CREATE SEQUENCE sequence_name START WITH desired_value ...;

这种方式会丢失序列的所有权限信息,所以需要重新授权。如果不想

DROP

,可以尝试先

ALTER SEQUENCE INCREMENT BY -current_value_offset

,然后

SELECT NEXTVAL FROM DUAL

多次来“消耗”掉多余的值,再

ALTER SEQUENCE INCREMENT BY 1

。但这种方法非常麻烦且容易出错,不推荐。

并发性能问题(

NOCACHE

):在高并发写入的场景下,如果序列使用了

NOCACHE

,每次获取

NEXTVAL

都需要对数据字典进行更新和锁定,这可能成为一个性能瓶颈。这也是为什么大多数场景下推荐使用

CACHE

的原因。

RAC环境下的

ORDER

选项:在RAC环境中,如果对序列的生成顺序有严格要求,必须使用

ORDER

选项。否则,不同节点生成的序列值可能会出现乱序,这可能导致一些依赖于严格顺序的业务逻辑出现问题。但正如前面所说,

ORDER

会带来性能开销。

理解这些高级用法和潜在陷阱,能帮助我们更好地设计和维护基于Oracle序列的系统。

如何管理和监控Oracle序列,以确保其稳定性和性能?

管理和监控Oracle序列,不仅仅是创建和使用那么简单,它还涉及到对序列状态的了解、对潜在问题的预警以及在必要时进行调整。作为DBA或者资深的开发人员,我发现这部分工作是确保系统稳定运行不可或缺的一环。

1. 查询序列的定义和当前状态

了解序列的定义是管理的第一步。我们可以通过查询数据字典视图来获取这些信息:

USER_SEQUENCES

当前用户拥有的序列。

ALL_SEQUENCES

当前用户可以访问的所有序列。

DBA_SEQUENCES

数据库中所有的序列(需要DBA权限)。

-- 查询当前用户拥有的序列信息SELECT  SEQUENCE_NAME,  MIN_VALUE,  MAX_VALUE,  INCREMENT_BY,  LAST_NUMBER, -- 序列的当前值(或下一个可用值,取决于CACHE设置)  CACHE_SIZE,  LAST_NUMBER - CACHE_SIZE AS ACTUAL_LAST_NUMBER, -- 如果有CACHE,这个值是实际被消耗的最后一个值  CYCLE_FLAG,  ORDER_FLAGFROM USER_SEQUENCESWHERE SEQUENCE_NAME = 'MY_ID_SEQ';-- LAST_NUMBER 的说明:-- 如果是NOCACHE,LAST_NUMBER就是上一次NEXTVAL返回的值。-- 如果是CACHE,LAST_NUMBER是缓存中最大的那个值,而不是上一次NEXTVAL返回的值。-- 实际的当前值(即上一次NEXTVAL返回的值)通常是 LAST_NUMBER - CACHE_SIZE。

通过这些查询,我们可以检查序列的

MAX_VALUE

是否合理、

CACHE_SIZE

是否符合预期,以及

LAST_NUMBER

是否接近

MAX_VALUE

2. 调整序列(

ALTER SEQUENCE

Oracle允许我们修改序列的大部分属性,但请注意,

START WITH

参数不能直接修改。

-- 增加序列的缓存大小,以提高性能ALTER SEQUENCE my_id_seq CACHE 100;-- 修改序列的增量步长ALTER SEQUENCE my_id_seq INCREMENT BY 2;-- 修改序列的最大值(如果之前设置了MAXVALUE,或者要从NOMAXVALUE改为MAXVALUE)ALTER SEQUENCE my_id_seq MAXVALUE 999999999999999999999999999; -- 几乎是无限大

重要的注意事项:

ALTER SEQUENCE

不会影响已经缓存的序列值。

START WITH

无法通过

ALTER SEQUENCE

直接修改。如果需要改变起始值,最安全的方法是

DROP

然后

CREATE

。修改

INCREMENT BY

后,

NEXTVAL

会立即按照新的步长生成值。

3. 序列重置的“土办法”与风险

正如前面提到的,Oracle没有直接的

RESET

命令。如果真的需要将序列重置到某个特定的起始值,通常的做法是:

备份序列的权限和依赖关系。

DROP SEQUENCE sequence_name;
CREATE SEQUENCE sequence_name START WITH new_start_value ...;

重新授予权限。

这种方法简单粗暴,但会短暂地中断序列的可用性,并且丢失所有权限信息,因此在生产环境操作时务必谨慎,并做好充分的测试和准备。

4. 监控与预警

接近

MAXVALUE

预警: 对于设置了

MAXVALUE

的序列,需要定期监控

LAST_NUMBER

是否接近

MAXVALUE

。可以通过编写PL/SQL脚本或使用监控工具,在序列值达到某个阈值(例如

MAXVALUE

的90%)时发出告警,以便及时调整

MAXVALUE

或采取其他措施。性能监控: 对于高并发系统,如果发现序列操作成为性能瓶颈(例如,

NOCACHE

序列),需要评估是否可以切换到

CACHE

模式,或者考虑其他ID生成策略(如UUID)。可以通过AWR报告或V$视图(如

V$SEGMENT_STATISTICS

,虽然序列本身不是段,但它的数据字典操作会反映在系统统计中)来观察相关等待事件。序列权限: 确保只有必要的数据库用户才拥有

ALTER

DROP

序列的权限,防止误操作导致序列损坏。

有效的管理和监控策略能够帮助我们避免因序列问题导致的应用程序中断,并优化系统的整体性能。这需要对数据库的运行机制有深入的理解,并结合实际业务需求进行权衡。

以上就是Oracle插入序列值怎么操作_Oracle序列值插入使用教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1057778.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
在Apache PDFBox中嵌入STSong字体以支持中文文本
上一篇 2025年12月2日 10:14:16
edge浏览器如何使用家庭安全设置_Edge家长控制与账户保护方法
下一篇 2025年12月2日 10:14:19

相关推荐

  • composer require-dev和require有什么不同_Composer Require与Require-Dev区别解析

    require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定…

    2026年5月10日
    900
  • Matplotlib 地图中多类型图例的创建与优化

    Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化

    本教程旨在解决matplotlib地图可视化中,如何在一个图例中同时展示颜色块(如区域分类)和自定义标记(如特定兴趣点)的问题。文章详细介绍了当传统`patch`对象无法正确显示标记时,如何利用`matplotlib.lines.line2d`创建标记图例句柄,并将其与颜色块图例句柄合并,从而生成一…

    2026年5月10日 用户投稿
    100
  • 利用海象运算符简化条件赋值:Python教程与最佳实践

    本文旨在探讨Python中海象运算符(:=)在条件赋值场景下的应用。通过对比传统if/else语句与海象运算符,以及条件表达式,分析海象运算符在简化代码、提高可读性方面的优势与局限性。并通过具体示例,展示如何在列表推导式等场景下合理使用海象运算符,同时强调其潜在的复杂性及替代方案,帮助开发者更好地掌…

    2026年5月10日
    000
  • Debian syslog性能优化技巧有哪些

    提升Debian系统syslog (通常基于rsyslog)性能,关键在于精简配置和高效处理日志。以下策略能有效优化日志管理,提升系统整体性能: 精简配置,高效加载: 在rsyslog配置文件中,仅加载必要的输入、输出和解析模块。 使用全局指令设置日志级别和格式,避免不必要的处理。 自定义模板: 创…

    2026年5月10日
    000
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • RichHandler与Rich Progress集成:解决显示冲突的教程

    在使用rich库的`richhandler`进行日志输出并同时使用`progress`组件时,可能会遇到显示错乱或溢出问题。这通常是由于为`richhandler`和`progress`分别创建了独立的`console`实例导致的。解决方案是确保日志处理器和进度条组件共享同一个`console`实例…

    2026年5月10日
    000
  • 理解编程指令:当结果正确,但实现方式不符要求时

    本文探讨了在编程实践中,即使程序输出了正确的结果,但若其实现方式未能严格遵循既定指令,仍可能被视为“不正确”的问题。我们将通过具体示例,对比直接求和与累加求和两种实现策略,强调理解和遵守编程规范的重要性,以确保代码的健壮性、可维护性及符合项目要求。 在软件开发过程中,我们经常会遇到这样的情况:编写的…

    2026年5月10日
    000
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • 前端缓存策略与JavaScript存储管理

    根据数据特性选择合适的存储方式并制定清晰的读写与清理逻辑,能显著提升前端性能;合理运用Cookie、localStorage、sessionStorage、IndexedDB及Cache API,结合缓存策略与定期清理机制,可在保证用户体验的同时避免安全与性能隐患。 前端缓存和JavaScript存…

    2026年5月10日
    100
  • 网站标题关键词更新后,搜索引擎为何仍显示旧标题?

    网站标题更新后,搜索引擎为何显示旧标题? 网站SEO优化中,站长常修改网站标题关键词,期望搜索结果显示自定义标题。然而,即使更新标签、meta keywords、meta description和结构化数据中的name属性后,搜索结果仍显示旧标题,这令人费解。本文将对此进行解释。 问题:站长修改了网…

    2026年5月10日
    100
  • 深入理解 Express.js 中 next() 参数的作用与中间件机制

    本文深入探讨 express.js 中间件函数中的 `next()` 参数。它负责将控制权传递给请求-响应周期中的下一个中间件或路由处理程序。文章将详细解释 `next()` 的工作原理、中间件的注册与执行顺序,以及不正确使用 `next()` 可能导致请求挂起的风险,并通过代码示例和实际应用场景,…

    2026年5月10日
    000
  • Python命令怎样使用profile分析脚本性能 Python命令性能分析的基础教程

    使用Python的cProfile模块分析脚本性能最直接的方式是通过命令行执行python -m cProfile your_script.py,它会输出每个函数的调用次数、总耗时、累积耗时等关键指标,帮助定位性能瓶颈;为进一步分析,可将结果保存为文件python -m cProfile -o ou…

    2026年5月10日
    000
  • 使用 WebCodecs VideoDecoder 实现精确逐帧回退

    本文档旨在解决在使用 WebCodecs VideoDecoder 进行视频解码时,实现精确逐帧回退的问题。通过比较帧的时间戳与目标帧的时间戳,可以避免渲染中间帧,从而提高用户体验。本文将提供详细的解决方案和示例代码,帮助开发者实现精确的视频帧控制。 在使用 WebCodecs VideoDecod…

    2026年5月10日
    000
  • 如何插入查询结果数据_SQL插入Select查询结果方法

    如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法

    使用INSERT INTO…SELECT语句可高效插入数据,通过NOT EXISTS、LEFT JOIN、MERGE语句或唯一约束避免重复;表结构不一致时可通过别名、类型转换、默认值或计算字段处理;结合存储过程可提升可维护性,支持参数化与动态SQL。 将查询结果数据插入到另一个表中,可以…

    2026年5月10日 用户投稿
    000
  • Discord.py 交互按钮超时与持久化解决方案

    本教程旨在解决Discord.py中交互按钮在一段时间后出现“This Interaction Failed”错误的问题。我们将深入探讨视图(View)的超时机制,并提供通过正确设置timeout参数以及利用bot.add_view()方法实现按钮持久化的具体方案,确保您的机器人交互功能稳定可靠,即…

    2026年5月10日
    000
  • python中zip函数详解 python多序列压缩zip函数应用场景

    zip函数的应用场景包括:1) 同时遍历多个序列,2) 合并多个列表的数据,3) 数据分析和科学计算中的元素运算,4) 处理csv文件,5) 性能优化。zip函数是一个强大的工具,能够简化代码并提高处理多个序列时的效率。 在Python中,zip函数是一个非常有用的工具,它能够将多个可迭代对象打包成…

    2026年5月10日
    000
  • html5怎么画实线_HTML5用CSS border-style:solid画元素实线边框【绘制】

    可通过CSS的border-style属性设为solid添加实线边框:一、内联样式用border:2px solid #000;二、内部样式表统一设置如div{border:1px solid #333};三、外部CSS文件定义.my-box{border:3px solid red}并引入;四、单…

    2026年5月10日
    000
  • 谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    使用谷歌浏览器的开发者工具截图步骤:1. 按ctrl+shift+i(windows/linux)或cmd+option+i(mac)打开开发者工具。2. 点击右上角三个点,选择”更多工具”,再选择”截图”。3. 选择截取整个页面。推荐的谷歌浏览器扩展…

    2026年5月10日 用户投稿
    100

发表回复

登录后才能评论
关注微信