为什么 Oracle SQL 开发人员使用如此奇怪的删除标准?
Why does Oracle SQL Developer use such strange delete criteria?
在网格视图中删除行时,消息面板指示SQL开发人员发出此删除命令。
DELETE FROM "MH"."T" WHERE ROWID = 'AABUG+AAEAAEZtrAAA'
AND ORA_ROWSCN = '1220510600909'
and ( "A" is null or "A" is not null )
似乎指定 ROWID 应该足以识别行,所以
- 为什么指定ORA_ROWSCN?
- 更令人困惑的是,为什么 is null / not null 子句?
ROWID
只是行的物理地址。如果删除一行并插入另一行,则新行可能与旧行具有相同的 ROWID
。如果行中的数据已被修改,则其 ROWID
也可能已更改。 ORA_ROWSCN
标准确保这些都没有实际发生。它还允许 SQL 如果另一个会话在您读取数据后修改了数据,开发人员会提醒您,以便您可以确认您仍然想要删除该行。
我不知道 A is null or A is not null
谓词会添加什么。如果它是第一个谓词,我猜它是标准的 1 = 1
谓词,人们有时会添加到动态构建的查询中以简化动态构建 SQL 语句的过程。但这不适合它是查询中的最后一个谓词。 A
是 table 的主键吗?
在网格视图中删除行时,消息面板指示SQL开发人员发出此删除命令。
DELETE FROM "MH"."T" WHERE ROWID = 'AABUG+AAEAAEZtrAAA'
AND ORA_ROWSCN = '1220510600909'
and ( "A" is null or "A" is not null )
似乎指定 ROWID 应该足以识别行,所以
- 为什么指定ORA_ROWSCN?
- 更令人困惑的是,为什么 is null / not null 子句?
ROWID
只是行的物理地址。如果删除一行并插入另一行,则新行可能与旧行具有相同的 ROWID
。如果行中的数据已被修改,则其 ROWID
也可能已更改。 ORA_ROWSCN
标准确保这些都没有实际发生。它还允许 SQL 如果另一个会话在您读取数据后修改了数据,开发人员会提醒您,以便您可以确认您仍然想要删除该行。
我不知道 A is null or A is not null
谓词会添加什么。如果它是第一个谓词,我猜它是标准的 1 = 1
谓词,人们有时会添加到动态构建的查询中以简化动态构建 SQL 语句的过程。但这不适合它是查询中的最后一个谓词。 A
是 table 的主键吗?