我在創建類似於SQL Developer的表數據瀏覽器的工具的中間。我的數據庫是基於Oracle的。刪除列由ID
我只需要從SELECT結果中刪除例如:'行號3'。該表沒有任何PK或獨特的記錄。我嘗試過ROWNUM等各種技術,但沒有運氣。
我在創建類似於SQL Developer的表數據瀏覽器的工具的中間。我的數據庫是基於Oracle的。刪除列由ID
我只需要從SELECT結果中刪除例如:'行號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而不是ROWNUM。
假設它是一個標準的堆組織表(索引組織的表和集羣可能會帶來額外的複雜性),如果您沒有任何其他方式來識別行,則可以使用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
感謝
SELECT
的ROWID
然後DELETE
第三行..我有點錯過了。 – Yuri 2013-03-14 20:20:00