テーブルにデータを挿入した後、DELETE ステートメントやその他のステートメントを使用して、テーブル内のレコードを削除できます。本記事では、関連するステートメントの使い方と例を紹介します。
データ削除の準備
テーブルデータを削除する前に、以下の事項を確認してください:
データベースのOracleテナントに接続されていることを確認してください。データベースへの接続操作については、接続方法の概要を参照してください。
説明
現在ログインしているテナントが属するテナントモードは、
sysテナントでoceanbase.DBA_OB_TENANTSビューをクエリすることで確認できます。操作対象のテーブルに対する
DELETE権限を保有していることを確認してください。TRUNCATE TABLEステートメントを使用してテーブルデータを削除する場合は、そのテーブルに対するCREATE権限も必要です。現在のユーザー権限を確認する操作については、ユーザー権限の確認を参照してください。該当する権限を持っていない場合は、管理者に連絡し権限の付与を依頼してください。ユーザー権限に関する操作については、直接権限付与を参照してください。
DELETEステートメントを使用したデータの削除
通常、テーブル内の一部またはすべてのデータを削除するには、DELETE ステートメントを使用します。
シンプルな DELETE ステートメントの形式は次のとおりです:
DELETE FROM table_name [ WHERE condition ];
パラメータ |
必須 |
説明 |
|---|---|---|
| table_name | はい | 削除対象のテーブルを指定します |
| [ WHERE condition ] | いいえ | 条件句は、削除するデータが満たす必要がある条件を指定します。指定しない場合、テーブル全体が削除されます。 |
説明
テーブルのレコード数が数百万件を超えると、大規模トランザクションが発生し、パフォーマンスに影響を与える可能性があります。WHERE 条件を指定してバッチ処理で削除するか、TRUNCATE TABLE ステートメントを使用することを推奨します。
一部のデータを削除する
DELETE ステートメントに WHERE 条件を追加することで、テーブル内の条件に合致する一部のデータを削除できます。
例1:t_insert テーブルから value = 10004 に一致するすべての行レコードを削除します。
obclient [SYS]> SELECT * FROM t_insert;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10002 | 31-OCT-22 |
| 2 | US | 10004 | 31-OCT-22 |
| 3 | UK | 10004 | 01-NOV-22 |
+----+------+-------+------------+
3 rows in set
obclient [SYS]> DELETE FROM t_insert WHERE value = 10004;
Query OK, 2 rows affected
obclient [SYS]> SELECT * FROM t_insert;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10002 | 31-OCT-22 |
+----+------+-------+------------+
1 row in set
すべてのデータを削除する
テーブル内のデータ量が少ない場合は、DELETE ステートメントを直接使用してすべての行レコードを削除することもできます。
例2:テーブル t_insert のすべてのレコードを削除します。
obclient [SYS]> DELETE FROM t_insert;
Query OK, 3 row affected
テーブル内のデータレコードが100万件を超える場合、一度に削除を実行するとパフォーマンス上の問題が発生する可能性があります。テーブル内の情報に基づいて、データを数回に分けて削除することを推奨します。例を以下に示します。
例3:value < 20000、value < 30000、value < 40000 のデータを数回に分けて削除します。
obclient [SYS]> DELETE FROM t_insert WHERE value < 20000;
obclient [SYS]> DELETE FROM t_insert WHERE value < 30000;
obclient [SYS]> DELETE FROM t_insert WHERE value < 40000;
TRUNCATE TABLEステートメントを使用してテーブルデータを削除する
TRUNCATE TABLE ステートメントは、指定されたテーブルのデータを完全に削除しますが、テーブル構造(テーブルで定義されたパーティション情報を含む)は保持します。論理的には、このステートメントはすべての行を削除する DELETE FROM ステートメントと同じです。
TRUNCATE TABLE ステートメントの構文は以下のとおりです:
TRUNCATE [TABLE] table_name;
例4:TRUNCATE TABLE ステートメントを使用して、テーブル t_insert のすべてのデータを削除します。
obclient> TRUNCATE TABLE t_insert;
TRUNCATE TABLE ステートメントの使用方法および説明の詳細については、TRUNCATE TABLEを参照してください。
DBLinkを使用したDELETEステートメントによるデータの削除
現在、OceanBaseデータベースはDBLinkを通じて、OceanBaseデータベース(Oracleモード)およびOracleデータベース内のデータを削除することをサポートしています。
DBLinkを使用して、リモートデータベースのテーブルt5からC2 = 7のデータ行を削除する例を以下に示します:
obclient> SET ob_trx_timeout = 1000000000;
Query OK, 0 rows affected
obclient> SELECT * FROM t5@orcl_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 7 | 7 |
| 8 | 8 |
+------+------+
2 row in set
obclient> DELETE FROM t5@orcl_dblink WHERE C2 = 7;
Query OK, 1 row affected
obclient> commit;
Query OK, 0 rows affected
obclient> SELECT * FROM t5@orcl_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 8 | 8 |
+------+------+
1 row in set
OceanBaseデータベースのOracleモードは、ローカルテーブルのデータを(INSERT、DELETE、UPDATE、およびMERGE INTOを使用して)リモートテーブルに書き込むことをサポートしています。詳細については、DBLinkを使用してリモートデータベースのデータを変更するを参照してください。