我正在创建一个类似于 SQL Developer 表数据查看器的工具。我的数据库是基于 Oracle 的。
我只需要从 SELECT 结果中删除例如:'row number 3'。该表没有任何 PK 或唯一记录。我用 ROWNUM 等尝试了各种技术,但没有运气。
Oracle 有一个伪列,您可以在简单的情况下ROWID
将其用于此目的。
select rowid, ... from your_table where ... ;
delete from your_table where rowid = <what you got above>;
如果您的界面允许用户创建复杂的视图/连接/聚合,那么知道用户打算删除什么(因此知道rowids
要收集哪组表以及要从哪组表中删除)将会很棘手。
警告:rowids
仅在给定表中是唯一的,并且引用上述文档:
如果您删除一行,Oracle 可能会将其 rowid 重新分配给稍后插入的新行。
所以,如果你这样做,要非常非常小心。
假设它是一个标准的堆组织表(索引组织表和集群可能会引入额外的复杂性),如果您没有任何其他方式来标识行,则可以使用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
然后使用第三ROWID
行DELETE
ROWID
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
尝试使用 ROWID 而不是 ROWNUM。