0

我正在创建一个类似于 SQL Developer 表数据查看器的工具。我的数据库是基于 Oracle 的。

我只需要从 SELECT 结果中删除例如:'row number 3'。该表没有任何 PK 或唯一记录。我用 ROWNUM 等尝试了各种技术,但没有运气。

4

3 回答 3

1

Oracle 有一个伪列,您可以在简单的情况下ROWID将其用于此目的。

select rowid, ... from your_table where ... ;
delete from your_table where rowid = <what you got above>;

如果您的界面允许用户创建复杂的视图/连接/聚合,那么知道用户打算删除什么(因此知道rowids要收集哪组表以及要从哪组表中删除)将会很棘手。

警告:rowids仅在给定表中是唯一的,并且引用上述文档:

如果您删除一行,Oracle 可能会将其 rowid 重新分配给稍后插入的新行。

所以,如果你这样做,要非常非常小心。

于 2013-03-14T19:57:45.190 回答
1

假设它是一个标准的堆组织表(索引组织表和集群可能会引入额外的复杂性),如果您没有任何其他方式来标识行,则可以使用ROWID伪列。这为您提供了有关磁盘上一行的物理位置的信息。这意味着ROWID特定行的 可以随着时间而改变,并且ROWID当您删除一行时可以并且将被重用,然后后续INSERT操作插入恰好位于磁盘上相同物理位置的新行。对于大多数应用程序,可以合理地假设在ROWID您执行查询的时间和发出的时间之间将保持不变,DELETE但您不应尝试在ROWID任何时间段内存储 。

例如,如果我们创建一个简单的两列表和几行

SQL> create table foo( col1 number, col2 varchar2(10) );

Table created.

SQL> insert into foo values( 1, 'Justin' );

1 row created.

SQL> insert into foo values( 1, 'Justin' );

1 row created.

SQL> insert into foo values( 2, 'Bob' );

1 row created.

SQL> insert into foo values( 2, 'Charlie' );

1 row created.

SQL> commit;

Commit complete.

我们可以SELECT然后使用第三ROWIDDELETEROWID

SQL> select *
  2    from foo;

      COL1 COL2
---------- ----------
         1 Justin
         1 Justin
         2 Bob
         2 Charlie

SQL> select rowid, col1, col2
  2    from foo;

ROWID                    COL1 COL2
------------------ ---------- ----------
AAAfKXAAEAABt7vAAA          1 Justin
AAAfKXAAEAABt7vAAB          1 Justin
AAAfKXAAEAABt7vAAC          2 Bob
AAAfKXAAEAABt7vAAD          2 Charlie

SQL> delete from foo where rowid = 'AAAfKXAAEAABt7vAAC';

1 row deleted.

SQL> select * from foo;

      COL1 COL2
---------- ----------
         1 Justin
         1 Justin
         2 Charlie
于 2013-03-14T19:58:28.083 回答
0

尝试使用 ROWID 而不是 ROWNUM。

于 2013-03-14T19:58:16.350 回答