为什么Oracle SQL Developer使用这种奇怪的删除标准?

Mar*_*son 3 oracle oracle-sqldeveloper

删除网格视图中的行时,消息面板指示SQL Developer发出此删除命令.

DELETE FROM "MH"."T" WHERE ROWID = 'AABUG+AAEAAEZtrAAA'
                       AND ORA_ROWSCN = '1220510600909'
                       and ( "A" is null or "A" is not null )
Run Code Online (Sandbox Code Playgroud)

似乎指定ROWID应该足以识别行,所以

  • 为什么要指定ORA_ROWSCN?
  • 更令人困惑的是,为什么是null/not null子句?

Jus*_*ave 6

ROWID只是行的物理地址.如果删除了一行并插入了另一行,则新行可能ROWID与旧行相同.如果行中的数据已被修改,则其ROWID可能也已更改.该ORA_ROWSCN标准确保这些都不实际上发生了.它还允许SQL Developer在您读取数据时另一个会话已修改数据时提醒您,以便您可以确认仍要删除该行.

我不知道A is null or A is not null谓词会添加什么.如果它是第一个谓词,我猜它是标准1 = 1谓词,人们有时会添加到动态构建的查询中,以简化动态构建SQL语句的过程.但这不适合它作为查询中的最后一个谓词.是A表的主键吗?