Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Oracle SQL Developer使用如此奇怪的删除条件?_Oracle_Oracle Sqldeveloper - Fatal编程技术网

为什么Oracle SQL Developer使用如此奇怪的删除条件?

为什么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 更

在网格视图中删除行时,消息面板指示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
  • 更令人困惑的是,为什么是null/notnull子句

    • 行ID只是行的物理地址。如果删除一行并插入另一行,新行的
      ROWID可能与旧行相同。如果行中的数据已修改,则其
      ROWID
      也可能已更改。
      ORA_ROWSCN
      标准确保这两种情况都没有实际发生。它还允许SQL Developer在您读取数据后,如果另一个会话修改了数据,则向您发出警告,以便您确认仍要删除该行


      我不知道
      a为null或a不为null的谓词将添加什么内容。如果它是第一个谓词,我猜人们有时会向动态生成的查询中添加标准的
      1=1
      谓词,以简化动态生成SQL语句的过程。但这与它作为查询中的最后一个谓词不符。
      A
      是表的主键吗

      值得一提的是,如果没有为表指定
      rowdependencies
      ,使用
      ora_rowscn
      作为乐观锁定实现的版本控制列是没有意义的-如果没有它,工具会认为同一块中的所有行都是changed@beherenow-没有
      行依赖关系
      ,在块级别跟踪该值。它对于实现乐观锁定仍然有用,只是误报的风险更大。乐观锁定已经接受了误报的可能性(比如有人更新了行而没有更改任何数据)。谢谢Justin,这很有意义!