在使用implict update table 时,发现其中一个表一定要有唯一约束,否则会报错!但是oracle可以使用hints:/*+ BYPASS_UJVC*/ 屏蔽掉队唯一性的检查。具体测试过程如下:
SQL> CREATE TABLE test_a(
2 id NUMBER ,
3 score NUMBER );
Table created.
Elapsed: 00:00:00.10
SQL>
CREATE TABLE test_b(
2 id NUMBER);
Table created.
Elapsed: 00:00:00.01
SQL>
SQL> INSERT INTO test_a VALUES(1,100);
INSERT INTO test_a VALUES(2,200);
1 row created.
Elapsed: 00:00:00.01
SQL>
INSERT INTO test_a VALUES(3,300);
1 row created.
Elapsed: 00:00:00.00
SQL>
1 row created.
Elapsed: 00:00:00.00
SQL> INSERT INTO test_b VALUES(1);
1 row created.
Elapsed: 00:00:00.01
SQL> INSERT INTO test_b VALUES(2);
1 row created.
Elapsed: 00:00:00.00
SQL> INSERT INTO test_b VALUES(3);
1 row created.
Elapsed: 00:00:00.01
SQL> INSERT INTO test_b VALUES(4);
1 row created.
Elapsed: 00:00:00.01
SQL>
SQL> SELECT * FROM test_a ORDER BY 1;
SELECT * FROM test_b ORDER BY 1;
ID SCORE
---------- ----------
1 100
2 200
3 300
3 rows selected.
Elapsed: 00:00:00.01
SQL>
ID
----------
1
2
3
4
4 rows selected.
Elapsed: 00:00:00.01
现在更新a表的字段:(先不考虑SQL的功能,只是测试这种方法)
SQL> UPDATE (
2 SELECT a.id,a.score,b.id AS b_id
3 FROM test_a a,
4 test_b b
5 WHERE a.id=b.id
6 )
7 SET id=b_id;
SET id=b_id
*
ERROR at line 7:
ORA-01779: cannot modify a column which maps to a non key-preserved table
报错了,需要对b表加唯一索引。加入hints执行
SQL> UPDATE (
2 SELECT/*+ BYPASS_UJVC*/ a.id,a.score,b.id AS b_id
3 FROM test_a a,
4 test_b b
5 WHERE a.id=b.id
6 )
7 SET id=b_id;
3 rows updated.
Elapsed: 00:00:00.01
说明:oracle可以跳过检查唯一约束。
继续往b表添加一条记录,使b表的记录不唯一。
SQL> INSERT INTO test_b VALUES(3);
1 row created.
Elapsed: 00:00:00.00
SQL> COMMIT;
Commit complete.
Elapsed: 00:00:00.00
SQL> SELECT * FROM TEST_B ORDER BY 1;
ID
----------
1
2
3
3
4
5 rows selected.
Elapsed: 00:00:00.00
SQL> UPDATE (
2 SELECT/*+ BYPASS_UJVC*/ a.id,a.score,b.id AS b_id
3 FROM test_a a,
4 test_b b
5 WHERE a.id=b.id
6 )
7 SET id=b_id;
4 rows updated.
Elapsed: 00:00:00.01
SQL> SELECT * FROM TEST_A;
ID SCORE
---------- ----------
1 100
2 200
3 300
3 rows selected.
Elapsed: 00:00:00.00
总结:使用了该hints,oracle就完全放弃了检查唯一性。因此SQL可以执行通过。
但要注意,是否能达到我们希望的目的,例如:下面进行一个有意义的更新,将a表中只要id在b表中出现就更新score,将score加1.
执行SQL如下:
SQL> UPDATE (
2 SELECT/*+ BYPASS_UJVC*/ a.id,a.score,b.id AS b_id
3 FROM test_a a,
4 test_b b
5 WHERE a.id=b.id
6 )
7 SET score=score+1;
4 rows updated.
Elapsed: 00:00:00.00
SQL> SELECT * FROM TEST_A;
ID SCORE
---------- ----------
1 101
2 201
3 302
3 rows selected.
Elapsed: 00:00:00.01
发现对于id=3的记录多加了个1。因此并没有得到我们想要的结果。这种情况应该先对b表的id进行去重。然后再更新。(其实完全也可以换种写法,呵呵) ,在此就不写了
总结:虽然对于此种应用,oracle跳过了检查唯一性,但是我们要注意在具体使用时,是否真的就达到了我们的效果!
要巧用并且活用现在已经有的功能。
转载自:http://blog.csdn.net/ningjieshuijing/article/details/5850208
分享到:
相关推荐
//RCC_HSEConfig(RCC_HSE_Bypass); RCC_HSEConfig(RCC_HSE_ON);//亚明小板设置方法 (最常用的无源晶振设置方法) /* Wait till HSE is ready 等待 HSE 起振*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if ...
Bypass_1.13.79.zip
外网软件 mtk线刷授权 mtk机型解锁 super解包等 自带图文翻译与操作动画 解密bbs.ydss.cn
iCL0udin_icloud_bypass_v1.0苹果解id
Pro Bangla Bypass Tool_probangla_bypass_tool_icloud_Icloudbypass
適用於近期之xccode之過渡偵測方式之檔案
configurationFile配置文件解密
1. -w # 隐藏控制台窗口窗口的应用程序 3. -d # 不编码PHP文件 4. dll # 嵌入和使用PHP扩展 1. bamcompile.exe -w
大华的java笔试题dahua_dvr_auth_bypass 大华CCTV DVR认证绕过Metasploit扫描模块 这是一个 Metasploit 模块,用于扫描和利用大华和大华更名的 CCTV DVR。 安装: git 克隆 将 dahua_dvr_auth_bypass.rb 文件复制到 ...
12306Bypass_1.10.78 抢票软件
免杀webshell
nginx+php-fpm+ openssl+ pcre+ zlib+ access_log_bypass_if.tar.gz 一键部署脚本,自动生成access errorlog的pipe以及相关目录,自动切割日志。启动脚本再/root/nginx_start_script 下
Bypass_1.14.2.zip
MPL_bypass_HS
下载请全部解压,不要丢失DLL文件,软件需以文件夹形式保存,如需放桌面,可右键-发送-桌面快捷方式。
(1)常见形式: /**/ 、 /* (2)空白字符: (3)浮点数形式 :1.1 (4)1E0的形式: (1)空白字符 (2)注释符 (3)括号 (1)空白字
NGS-bypas_inject_nexon_bypass_nexongamesecurity_NGS_源码.zip
信息安全_数据安全_Bypass_Windows_Exploit_Guard_ASR 安全建设 安全体系 安全应急 数字认证 安全管理
Bypass_1.15.10.zip