按ID删除行

时间:2013-03-14 19:50:14

标签: oracle position row

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

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

3 个答案:

答案 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。