テーブルにデータを挿入した後、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ステートメントは、削除するデータが満たす必要がある条件を指定します。条件が指定されていない場合は、テーブル全体が削除されます。 |
説明
テーブルレコード数が数百万件を超えると、大規模トランザクションが発生し、パフォーマンスに影響を与える可能性があります。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を使用してリモートデータベースのデータを変更するを参照してください。