为什么Oracle SQL Developer使用如此奇怪的删除条件?
在网格视图中删除行时,消息面板指示SQLDeveloper发出此删除命令为什么Oracle SQL Developer使用如此奇怪的删除条件?,oracle,oracle-sqldeveloper,Oracle,Oracle Sqldeveloper,在网格视图中删除行时,消息面板指示SQLDeveloper发出此删除命令 DELETE FROM "MH"."T" WHERE ROWID = 'AABUG+AAEAAEZtrAAA' AND ORA_ROWSCN = '1220510600909' and ( "A" is null or "A" is not null ) 指定ROWID似乎足以标识行,因此 为什么它指定了ORA_ROWSCN 更
DELETE FROM "MH"."T" WHERE ROWID = 'AABUG+AAEAAEZtrAAA'
AND ORA_ROWSCN = '1220510600909'
and ( "A" is null or "A" is not null )
指定ROWID似乎足以标识行,因此
- 为什么它指定了ORA_ROWSCN
- 更令人困惑的是,为什么是null/notnull子句
- 行ID只是行的物理地址。如果删除一行并插入另一行,新行的
ROWID可能与旧行相同。如果行中的数据已修改,则其ROWID
也可能已更改。ORA_ROWSCN
标准确保这两种情况都没有实际发生。它还允许SQL Developer在您读取数据后,如果另一个会话修改了数据,则向您发出警告,以便您确认仍要删除该行
我不知道a为null或a不为null的谓词将添加什么内容。如果它是第一个谓词,我猜人们有时会向动态生成的查询中添加标准的1=1
谓词,以简化动态生成SQL语句的过程。但这与它作为查询中的最后一个谓词不符。A
是表的主键吗 值得一提的是,如果没有为表指定rowdependencies
,使用ora_rowscn
作为乐观锁定实现的版本控制列是没有意义的-如果没有它,工具会认为同一块中的所有行都是changed@beherenow-没有行依赖关系
,在块级别跟踪该值。它对于实现乐观锁定仍然有用,只是误报的风险更大。乐观锁定已经接受了误报的可能性(比如有人更新了行而没有更改任何数据)。谢谢Justin,这很有意义!