`
panshaobinSB
  • 浏览: 203921 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

加字段然后批量更新

 
阅读更多
本次的业务需求是:在一张旧表t_bnet_customer上增加了一个新的字段,这个字段在值在另一张表t_customer_extend里面,一一对应来更新;

原先的语句:

UPDATE t_bnet_customer a
    SET a.customer_id = (SELECT  b.cust_nbr FROM t_customer_extend b
    WHERE a.id = b.bnet_id )
    WHERE EXISTS (SELECT  b.cust_nbr FROM t_customer_extend b
    WHERE a.id = b.bnet_id)

后来的语句:

update (
select a.customer_id a1, b.cust_nbr b1
from t_bnet_customer   a,
t_customer_extend b
where a.id = b.bnet_id
)  set a1 = b1  ;

上面的语句被oracle限制了,不能执行的话,换成下面的:

update (
select /*+ BYPASS_UJVC */ a.customer_id a1, b.cust_nbr b1
from t_bnet_customer   a,
t_customer_extend b
where a.id = b.bnet_id
)  set a1 = b1  ;

---------------------------------原因如下---------------------------------

http://lastcaress.blog.sohu.com/149585028.html

用implicit view update的时候,如果源表没加唯一性约束,会碰到

ORA-01779: cannot modify a column which maps to a non key-preserved table

比如用下面的pzl_test_1 b的col2去更新pzl_test a的col2,用两表的col1关联



SQL> select col1,col2 from pzl_test;

COL1        COL2
--------------------------------------------------------------------------------
1           A

2           B

3           C



SQL> select col1,col2 from pzl_test_1 b;

COL1        COL2
--------------------------------------------------------------------------------
2           BB

3           CC

4           DD



如果b表的col1字段没有唯一约束,执行

SQL> update

  2  (select a.col2 col2a,b.col2 col2b

  3  from pzl_test a,

  4  pzl_test_1 b

  5  where a.col1=b.col1

  6  )

  7  set col2a=col2b;



结果是:

ERROR at line 7:
ORA-01779: cannot modify a column which maps to a non key-preserved table



然后给b表加上唯一性约束:

SQL> create unique index idx_pzl_test_1 on pzl_test_1(col1);

Index created.



再执行之前的update语句,就可以成功了

SQL> 省略..
2 rows updated.



查看a表结果:

SQL> select col1,col2 from pzl_test;

COL1        COL2
--------------------------------------------------------------------------------
1           A

2           BB

3           CC



显示正常。



先rollback了它。

SQL> rollback;

Rollback complete.



ORACLE要求b表关联字段唯一是合理的,否则更新a表时,如果b表有多条记录对应,不知道用哪条记录去更新才好。

但在实际开发时,经常会碰到虽然逻辑上能保证b表的关联字段唯一,但不想,或者无法给它加唯一性约束的情况(它是唯一,却不能给它一个名分。。)


以前碰到这样的情况,我是用update a + 两句子查询或者先过滤b表再merge来实现的。但这样对b表的访问次数是implicit view update的2倍,降低了效率。(10g以上版本可以用一句merge实现和view update相同的效果,但我们最大的两个数据库都是9i

昨天晚上逛街时发现,原来有个hint可以强制oracle跳过唯一检查,在b表没有建唯一约束的情况下也能够用implicit view update

这就是/*+BYPASS_UJVC*/




把b表的唯一索引干掉:

SQL> drop index idx_pzl_test_1;

Index dropped.



再执行前面的update语句(加上hint):



SQL> update

  2  (select /*+BYPASS_UJVC*/ a.col2 col2a,b.col2 col2b

  3  from pzl_test a,

  4  pzl_test_1 b

  5  where a.col1=b.col1

  6  )

  7  set col2a=col2b;

2 rows updated.



更新成功了。更新后结果和建了唯一约束完全一样。



也就是说,只要能在逻辑上保证b表的关联字段唯一,就不是非得给它一个名分了。

借用一句格调低下的广告语:如果不能给它一个名分,就送它一套BYPASS_UJVC吧!



如果b表里关联字段不唯一,会产生什么效果呢?

下面测试一下:

往b表里插一条记录

SQL> insert into pzl_test_1 values('2','BBB');

1 row created.

现在b表里col1='2'的有2条了:'BB'和'BBB'。



执行update:



SQL> update

  2  (select /*+BYPASS_UJVC*/ a.col2 col2a,b.col2 col2b

  3  from pzl_test a,

  4  pzl_test_1 b

  5  where a.col1=b.col1

  6  )

  7  set col2a=col2b;

3 rows updated.



注意,这里显示是3 rows updated,虽然a表只有2条记录被更新。



查看a表,发现col1='2'的col2,会更新到b表中对应记录之一的值,究竟对应到哪条现在还不太清楚,应该和b表中记录的地址、implicit view的写法有关。以后有空再研究研究。



分享到:
评论

相关推荐

    ArcGis批量加字段.zip

    《ArcGIS批量加字段工具详解及应用》 ArcGIS是一款强大的地理信息系统软件,广泛应用于测绘、城市规划、环境研究等领域。在处理大量地理数据时,往往需要对数据字段进行管理和编辑,以满足特定的需求。"ArcGis批量...

    根据字段值批量输出shp

    本文将深入探讨如何根据字段值批量输出shp文件,这是一个在ArcGIS环境中常见的任务。ArcGIS是一款强大的GIS软件,它提供了丰富的工具和功能来处理空间数据。 首先,我们要理解“shp”文件的含义。SHP(Shapefile)...

    大量SHP文件批量加字段

    的字段如果要加二个,不能连着加.得关了程 序再开才能进行.否则弹的记事本内容中,前 面的内容还是上次的字段路径. 但可以连着加不同的字段类型. 比如加完TEXT类型的字段.不能接着加TEXT 类型的字段,但可以加DATE/...

    arcgis按字段属性批量转cad

    arcgis按字段属性批量转cad

    按字段值批量转kmz.tbx

    可以实现在arcgis中按照矢量文件的字段值批量转成以矢量字段值命名的kmz文件,便于在奥维软件中查看

    mysql批量增加字段.txt

    MySQL批量对表增加指定字段,会快速实现批量字段的添加。写了2个存储存储过程,执行即可。方便快速!

    利用arcgis批处理对SHP批量加字段addfield

    批量加字段的操作通常涉及以下步骤: 1. **启动ArcGIS Desktop**:打开ArcGIS Desktop应用程序,如ArcMap或ArcCatalog,这两个工具都支持批处理功能。 2. **加载数据**:在ArcCatalog中,浏览并选择需要添加字段的...

    性能实测:Spring Boot中六种批量更新技术谁更快?.zip

    包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...

    ARCGIS 按字段值批量导出矢量数据

    按字段属性合并导出

    根据字段值批量将SHP文件输出转换为KML文件.tbx

    一个SHP文件内涉及多个要素...如某个SHP里有两个要素,要素的其中一个属性字段为“范围”,这两个要素的字段值分别问“范围1”、“范围2”,使用此工具后,能一次输出“范围1.kml”和“范围2.kml”。(arcgis10.4版本)

    批量给SHP加字段.rar

    这个“批量给SHP加字段.rar”压缩包显然包含了关于如何在多个SHP文件中一次性添加字段的相关工具或教程。批量处理是提高工作效率的重要手段,特别是当你需要对大量SHP文件进行相同的操作时,例如添加新的属性字段。 ...

    Mybatis Plus 自定义批量插入或批量更新(根据唯一索引)

    这些方法接受一个实体对象列表,然后一次性将所有对象插入或更新到数据库。然而,当涉及到唯一索引时,简单的批量操作可能无法满足需求,因为可能会有重复的数据导致冲突。 在 Mybatis Plus 中自定义批量插入,我们...

    SQL Server批量插入批量更新工具类

    SQL Server批量插入批量更新工具类,SqlBulkCopy,BatchUpdate

    SQLServer 2008 批量修改字段类型.sql

    SQL Server 2008 批量修改字段类型,查询出所有需要修改的字段,然后修改

    KETTLE实现循环批量多表抽取添加字段

    4. 在子转换中,接收表名参数,然后用`Table Input`读取该表的数据,通过`Modified Java Script Value`添加新字段。 5. 最后,使用`Table Output`将更新后的数据写入MySQL目标数据库。 6. 在Job中,设置循环结构,...

    mysql 批量更新及效率对比

    MySQL 批量更新的高效方法 MySQL 批量更新是指在 MySQL 数据库中批量更新多条记录的操作。这种操作在实际应用中非常常见,例如批量更新用户信息、订单状态等。然而,批量更新的效率问题一直是一个棘手的问题。近期...

    ArcGIS(ArcPy)脚本excel批量添加字段

    本文将深入探讨如何使用ArcPy脚本来批量地在Excel表格中添加字段,这对于处理大量地理属性数据非常有用。 首先,了解ArcPy的基本结构是必要的。ArcPy包含了多个模块,如arcpy.env用于设置环境变量,arcpy....

    Thinkphp批量更新数据的方法汇总

    以下小编给大家列出了三种实现thinkphp批量更新数据的方法,写的不好还请见谅,有意见欢迎提出,共同学习进步! 方法一: //批量修改 data二维数组 field关键字段 参考ci 批量修改函数 传参方式 function batch_...

    Arcgis中利用python语言对多个shp文件进行批量添加字段

    Arcgis中利用python语言对shp文件批量添加字段,注释详细,只需更改shp文件所在文件夹路径,以及相关字段名称、类型、长度等设置即可

    arcmap——数据处理工具shp按字段批量导出dwg.tbx

    arcmap——数据处理工具shp按字段批量导出dwg.tbx

Global site tag (gtag.js) - Google Analytics