提问人:vsergi 提问时间:5/20/2022 更新时间:5/24/2022 访问量:83
Oracle SQL Developer 使用带有 delete from 子句的始终为“true”条件。(“xxx”为空或“xxx”不为空)
Oracle SQL Developer using an always "true" conditional with delete from clause. ("xxx" is null or "xxx" is not null)
问:
我今天使用的是 Oracle SQL Developer 版本 19.2.1.247,并使用图形方式删除了几行。我的意思是,我选择了这一行并按红色 x 叉号以删除所选行。 它奏效了,一切都很好。删除了行。
但是,我查看了日志并发现了这一点:
DELETE FROM "DB"."PERSONS" WHERE ROWID = 'AADG' AND ORA_ROWSCN = '5196' and ( "ID" is null or "ID" is not null )
好吧,我不明白最后一句话。
"ID" is null or "ID" is not null
显然,在我看来,这总是正确的。我很好奇这个 Oracle SQL 开发人员添加这个的原因。为什么要这样做?什么时候这种说法不会是真的?
答:
0赞
Connor McDonald
5/24/2022
#1
可能只是一个异常,但它不会对语句的执行(或性能)产生任何影响。例如,我做了:
SQL> create table t as select * from scott.emp;
Table created.
然后在 SQL Dev 中删除了一行,从而产生了
DELETE FROM "T" WHERE ROWID = 'AAZRaiABAAAA5eLAAL'
AND ORA_ROWSCN = '16330866545209'
and ( "EMPNO" is null or "EMPNO" is not null )
优化器想出了这个:
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 12 | 1 (0)| 00:00:01 |
| 1 | DELETE | T | | | | |
|* 2 | TABLE ACCESS BY USER ROWID| T | 1 | 12 | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("ORA_ROWSCN"=16330866545209)
多余的谓词被简单地忽略了。
我的表没有索引或主键,因此看起来只是从表中获取此谓词的第一列。
评论
where
true
true
false
unknown/NULL
not true