SQL Developer のテーブル データ ビューアに似たツールを作成中です。私のデータベースは Oracle ベースです。
たとえば、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
疑似列を使用できます。これにより、ディスク上の行の物理的な場所に関する情報が得られます。これはROWID
、特定の行のが時間の経過とともに変化する可能性があり、行を削除してから後続の操作でディスク上の同じ物理的な場所にある新しい行を挿入するROWID
ときに再利用できることを意味します。ほとんどのアプリケーションでは、クエリを実行してから発行するまでの間、は一定でINSERT
あると想定するのが妥当ですが、を一定期間保存しようとしないでください。ROWID
DELETE
ROWID
たとえば、単純な2列のテーブルと数行を作成するとします
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.
次に、3番目の行を使用し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
ROWNUMの代わりにROWIDを使用してみてください。