0

SQL Developer のテーブル データ ビューアに似たツールを作成中です。私のデータベースは Oracle ベースです。

たとえば、SELECT結果から「行番号3」を削除するだけです。そのテーブルには、PK も一意のレコードもありません。ROWNUM などでさまざまな手法を試しましたが、うまくいきません。

4

3 に答える 3

1

Oracleには、単純な場合ROWIDにこの目的で使用できる疑似列があります。

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

インターフェイスでユーザーが複雑なビュー/結合/集計を作成できる場合、ユーザーが何を削除しようとしていたかを知ること(つまり、どのセットのrowids収集とどのテーブルのセットから削除するかを知ること)は難しいでしょう。

警告:rowids特定のテーブル内でのみ一意であり、上記のドキュメントを引用します。

行を削除すると、OracleはそのROWIDを後で挿入される新しい行に再割り当てする場合があります。

したがって、これを行う場合は、非常に注意してください。

于 2013-03-14T19:57:45.190 に答える
1

これが標準のヒープ編成テーブルであると仮定すると(インデックス編成テーブルとクラスターはさらに複雑になる可能性があります)、行を識別する他の方法がない場合は、ROWID疑似列を使用できます。これにより、ディスク上の行の物理的な場所に関する情報が得られます。これはROWID、特定の行のが時間の経過とともに変化する可能性があり、行を削除してから後続の操作でディスク上の同じ物理的な場所にある新しい行を挿入するROWIDときに再利用できることを意味します。ほとんどのアプリケーションでは、クエリを実行してから発行するまでの間、は一定でINSERTあると想定するのが妥当ですが、を一定期間保存しようとしないでください。ROWIDDELETEROWID

たとえば、単純な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番目の行を使用しSELECTROWIDDELETEROWID

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
于 2013-03-14T19:58:28.083 に答える
0

ROWNUMの代わりにROWIDを使用してみてください。

于 2013-03-14T19:58:16.350 に答える