前两天测试的时候发现了这个现象,如果表中包含了延迟约束,则直接路径插入将转化为常规路径插入。

看一个简单的例子:

SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30), AGE NUMBER(3));

表已创建。

SQL> INSERT /*+ APPEND */ INTO T

2  SELECT ROWNUM, TNAME, MOD(ROWNUM, 10)

3  FROM TAB;

已创建23行。

SQL> SELECT COUNT(*) FROM T;

SELECT COUNT(*) FROM T

*第1行出现错误:

ORA-12838:无法在并行模式下修改之后读/修改对象

使用APPEND方式的插入,Oracle会选择直接路径插入,而导致的结果就是插入完成后,当前会话无法访问这张表,而只能选择提交或回滚。

而如果在表上添加一个延迟约束:

SQL> COMMIT;

提交完成。

SQL> ALTER TABLE T ADD CONSTRAINT CK_T_AGE

2  CHECK (AGE < 120)

3  DEFERRABLE

4  INITIALLY DEFERRED;

表已更改。

SQL> INSERT /*+ APPEND */ INTO T

2  SELECT ROWNUM, TNAME, MOD(ROWNUM, 10)

3  FROM TAB;

已创建23行。

SQL> SELECT COUNT(*) FROM T;

COUNT(*)

----------

46

虽然是同样的插入语句,但是这次显然不是直接路径插入。因为插入执行后,T表仍然可以访问。

很明显,由于延迟约束的存在导致了APPEND提示没有生效,直接路径插入变成常规路径插入。

SQL> ALTER TABLE T DROP CONSTRAINT CK_T_AGE;

表已更改。

SQL> ALTER TABLE T ADD CONSTRAINT CK_T_AGE

2  CHECK (AGE < 120)

3  DEFERRABLE

4  INITIALLY IMMEDIATE;

表已更改。

SQL> INSERT /*+ APPEND */ INTO T

2  SELECT ROWNUM, TNAME, MOD(ROWNUM, 10)

3  FROM TAB;

已创建23行。

SQL> SELECT COUNT(*) FROM T;

COUNT(*)

----------

69

可以看到,只要约束是可延迟的,不管这个约束是否现在延迟生效,直接路径插入都会变成常规路径插入。

oracle 延迟加载,延迟约束禁止直接路径插入相关推荐

  1. oracle非延迟约束,Oracle可延迟约束Deferable的使用

    标准规定,约束可以是deferrable或not deferrable(默认). not deferrable 约束在每一个DML语句后检查: deferrable 约束可以在每一个insert,de ...

  2. oracle延迟约束不起作用,Oracle可延迟约束Deferable的使用

    3deferrable用途 3.1物化视图 物化视图(快照),这是它的主要用途.这些视图会使用延迟约束来进行视图刷新.在刷新物化视图的过程中,可能会破坏完整性,而且将不能逐句检验约束.但到执行COMM ...

  3. 小议Oracle外键约束修改行为

    小议Oracle外键约束修改行为(一) Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在.而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作. 在SQL92 ...

  4. Oracle外键约束reference,oracle外键约束

    -- 创建测试主表. ID 是主键. CREATE TABLE test_main ( id      INT, value   VARCHAR(10), PRIMARY KEY(id) ); --  ...

  5. oracle银行卡号检查约束,oracle约束学习(1)unique和check

    有人说,没有索引, 拿什么来保证约束?姑且不论这话的对错,但约束的实现(除了not null),很多都是通过索引来快速定位约束的地方.unique约束会自动建立索引,pk也是.也因此,约束的很多问题总 ...

  6. 3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的区别,sql文件导入

     1相关术语 语句 含义 操作 DML语句 (Data Manipulation Language) 数据库操作语言 insert update delete select DDL语言 (Date ...

  7. TIMING_06 VIVADO环境下的时序约束 之 输入延迟约束

    由于该系列文章阅读有顺序性,所以请跳转至该系列文章第一篇从头开始阅读,并按照文章末尾指示按顺序阅读,否则会云里雾里,传送门在此:  https://blog.csdn.net/qq_33486907/ ...

  8. Oracle外键约束修改行为(一)

    Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在.而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作. 在SQL92标准中定义了几种外键改变后,如何处理子表 ...

  9. Oracle维护数据完整性——约束

    Oracle维护数据完整性--约束 维护数据的完整性--约束 约束用于确保数据库数据满足特定的规则.在oracle和sql server等数据库中,not null(非空).unique(唯一).pr ...

最新文章

  1. CenterNet算法快速入门
  2. 关于 ORA-01033: ORACLE initialization or shutdown in progress
  3. 安卓 屏蔽子控件点击事件
  4. C# 调用C++写的dll的实现方法
  5. boost::fusion::as_list用法的测试程序
  6. nand ubi - 5 kernel和ubi
  7. c语言字符串中取最大字符串,使用C语言提取子字符串及判断对称子字符串最大长度...
  8. 从714里连续减去6减几次得0_数学干货 | 小学数学1—6年级基础知识整理 ,预习复习都能用...
  9. 百度网盘视频加速代码
  10. 【Henu ACM Round #13 A】 Hulk
  11. 高中生可发表论文的学术期刊涵盖TCR历史期刊
  12. 怎么安装redhat linux操作系统,Linux操作系统RedHat6.5安装
  13. 什么样的人适合做外贸?能做好外贸?(非外贸零售)
  14. 【Leetcode刷题】:Python:416. 分割等和子集
  15. 有空就来刷几道5G面试题系列 | 5G架构篇
  16. 云计算时代-虚拟云桌面,实现随时随地办公
  17. CAD字体大全 集合2458种字体
  18. springboot整合security(一)入门
  19. [工具设置]xp iis连接数破解
  20. 如何使用C#复制或移动Excel工作表?试试Aspose

热门文章

  1. 更大的田字格python
  2. 语音技术IP电话的原理结构
  3. 【学习记录】之二:centos7快速配置goolge-test
  4. Goolge让一切变得简单
  5. 基于CNN-LSTM的滚动轴承故障诊断
  6. 石头剪刀布 L1-044 稳赢 15分
  7. CVM 单节点集群配置
  8. 为小程序端添加一个session机制
  9. AR220路由器、USG3000防火墙NAT及过滤配置
  10. 利用nodejs实现石头剪刀布游戏