2013-03-14 88 views
0

我在創建類似於SQL Developer的表數據瀏覽器的工具的中間。我的數據庫是基於Oracle的。刪除列由ID

我只需要從SELECT結果中刪除例如:'行號3'。該表沒有任何PK或獨特的記錄。我嘗試過ROWNUM等各種技術,但沒有運氣。

回答

1

Oracle有一個ROWID僞列,可以用於此目的在簡單情況下爲

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

如果你的界面允許用戶進行復雜的意見/聯接/骨料,然後知道用戶想要什麼,刪除(所以知道要收集哪些設置的rowids什麼組表中進行刪除)是怎麼回事要棘手。

警告:rowids僅在一個給定的表都是獨一無二的,並引用上面的文檔:

如果你刪除一行,那麼Oracle可以重新分配它的ROWID以後插入新行。

所以要非常小心,如果你這樣做。

0

嘗試使用ROWID而不是ROWNUM。

+0

感謝SELECTROWID然後DELETE第三行..我有點錯過了。 – Yuri 2013-03-14 20:20:00

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. 

我們可以使用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