我正在创建一个类似于SQL Developer表数据查看器的工具。我的数据库是基于Oracle的。
我只需要从SELECT结果中删除例如:'行号3'。该表没有任何PK或唯一记录。我已经尝试过ROWNUM等各种技术,但没有运气。
答案 0 :(得分:1)
Oracle有一个ROWID
伪列,您可以将其用于此目的,在简单的情况下。
select rowid, ... from your_table where ... ;
delete from your_table where rowid = <what you got above>;
如果您的界面允许用户制作复杂的视图/连接/聚合,那么知道用户想要删除的内容(因此知道要收集的rowids
集合以及要从中删除哪些表集合)太棘手了。
警告:rowids
仅在给定表格中是唯一的,并引用上述文档:
如果删除一行,则Oracle可能会将其rowid重新分配给稍后插入的新行。
如果你这样做,那就非常非常小心。
答案 1 :(得分:1)
假设它是一个标准的堆组织表(索引组织的表和集群可能会引入额外的复杂性),如果您没有任何其他方法来标识行,则可以使用ROWID
伪列。这将为您提供有关磁盘上行的物理位置的信息。这意味着特定行的ROWID
可以随时间变化,ROWID
可以并且将在您删除行时重复使用,然后后续INSERT
操作会插入发生的新行在磁盘上的相同物理位置。对于大多数应用程序,可以合理地假设ROWID
在您执行查询的时间与发出DELETE
的时间之间保持不变,但您不应该尝试存储ROWID
1}}任何时间段。
例如,如果我们创建一个简单的双列表和几行
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
答案 2 :(得分:0)
尝试使用ROWID而不是ROWNUM。