REPLACE INTO ステートメントを使用してデータの挿入または更新ができます。本記事では、関連するステートメントの使い方と例を紹介します。
データ置換の準備
テーブルデータを置き換える前に、以下の点を確認してください:
データベースのMySQLテナントに接続していることを確認してください。データベースへの接続操作については、接続方法の概要を参照してください。
説明
現在ログインしているテナントが属するテナントモードは、
sysテナントでoceanbase.DBA_OB_TENANTSビューをクエリすることで確認できます。操作対象テーブルに対する
INSERT、UPDATE、およびDELETE権限を保有していることを確認してください。現在のユーザー権限を確認する操作の詳細については、ユーザー権限の確認を参照してください。該当する権限を持っていない場合は、管理者に連絡し権限の付与を依頼してください。ユーザー権限に関する操作については、直接権限付与を参照してください。
データの置換
通常は REPLACE INTO ステートメントを使用して、テーブル内の1つまたは複数のレコードを置き換えます。
REPLACE INTO ステートメントの構文は次のとおりです:
REPLACE INTO table_name VALUES(list_of_values);
| パラメータ | 必須 | 説明 | 例 |
|---|---|---|---|
| table_name | はい | データを挿入するテーブルを指定します | table1 |
| (list_of_values) | はい | 挿入するデータ | (1,'CN',2001, current_timestamp ()) |
REPLACE INTO ステートメントは、置き換えるデータとテーブルの主キーまたは一意キーに基づいて、以下のように動作します:
主キーまたは一意キーとの競合がない場合、レコードを挿入します。
主キーまたは一意キーとの競合が存在する場合、既存のレコードを削除してから、新しい行レコードを挿入します。
説明
ターゲットテーブルには、主キーまたは一意インデックスを設定することを推奨します。設定しない場合、重複レコードが挿入されやすくなります。
テーブルにデータレコードが存在しない場合、またはデータレコードは存在するが、主キーまたは一意キーとの競合がない場合
テーブルにデータレコードが存在しない場合、またはテーブルにデータレコードが存在するが主キーまたは一意キーとの競合がない場合、REPLACE INTO ステートメントを使用してデータを置き換えることができます。結果は、INSERT ステートメントを使用してデータを挿入する場合と同じです。
例:
テーブル
t_replaceの作成後、REPLACE INTOステートメントを使用してデータ行を挿入します。obclient [test]> CREATE TABLE t_replace( id number NOT NULL PRIMARY KEY , name varchar(10) NOT NULL , value number ,gmt_create timestamp NOT NULL DEFAULT current_timestamp ); Query OK, 0 rows affected obclient [test]> REPLACE INTO t_replace values(1,'CN',2001, current_timestamp ()); Query OK, 1 row affected obclient [test]> SELECT * FROM t_replace; +----+------+-------+---------------------+ | id | name | value | gmt_create | +----+------+-------+---------------------+ | 1 | CN | 2001 | 2022-10-13 14:06:58 | +----+------+-------+---------------------+ 1 row in set例の結果から分かるように、テーブル
t_replaceの作成後にはデータは挿入されていません。REPLACE INTOステートメントの実行後、テーブルに1件のレコードが挿入されました。REPLACE INTOステートメントを再度使用して、データ行を挿入します。obclient [test]> SELECT * FROM t_replace; +----+------+-------+---------------------+ | id | name | value | gmt_create | +----+------+-------+---------------------+ | 1 | CN | 2001 | 2022-10-13 14:06:58 | +----+------+-------+---------------------+ 1 row in set obclient [test]> REPLACE INTO t_replace(id, name, value, gmt_create) VALUES(2,'US',2002,current_timestamp ()); Query OK, 1 row affected obclient [test]> SELECT * FROM t_replace; +----+------+-------+---------------------+ | id | name | value | gmt_create | +----+------+-------+---------------------+ | 1 | CN | 2001 | 2022-10-13 14:06:58 | | 2 | US | 2002 | 2022-10-13 14:17:56 | +----+------+-------+---------------------+ 2 rows in set例の結果から分かるように、テーブル
t_replaceには既に1件のレコードが存在します。(2,'US',2002,current_timestamp ())データとテーブル内のレコードは一意性制約に違反していないため、実行結果としてテーブルt_replaceに1件のレコードが挿入されます。クエリステートメントを使用して
REPLACE INTOステートメントのVALUES句の代わりに複数のデータを挿入します。テーブルt_insertのデータをテーブルt_replaceに挿入します。obclient [test]> SELECT * FROM t_replace; +----+------+-------+---------------------+ | id | name | value | gmt_create | +----+------+-------+---------------------+ | 1 | CN | 2001 | 2022-10-13 14:06:58 | | 2 | US | 2002 | 2022-10-13 14:17:56 | +----+------+-------+---------------------+ 2 rows in set obclient [test]> SELECT * FROM t_insert; +----+------+-------+---------------------+ | id | name | value | gmt_create | +----+------+-------+---------------------+ | 7 | EN | 1007 | 2022-10-13 14:36:36 | | 8 | JP | 1008 | 2022-10-13 14:36:36 | +----+------+-------+---------------------+ 2 rows in set obclient [test]> REPLACE INTO t_replace SELECT id,name,value,gmt_create FROM t_insert; Query OK, 2 rows affected Records: 2 Duplicates: 0 Warnings: 0 obclient [test]> SELECT * FROM t_replace; +----+------+-------+---------------------+ | id | name | value | gmt_create | +----+------+-------+---------------------+ | 1 | CN | 2001 | 2022-10-13 14:06:58 | | 2 | US | 2002 | 2022-10-13 14:17:56 | | 7 | EN | 1007 | 2022-10-13 14:36:36 | | 8 | JP | 1008 | 2022-10-13 14:36:36 | +----+------+-------+---------------------+ 4 rows in set
テーブルにデータレコードが存在し、主キーまたは一意キーとの競合が存在する場合
テーブルにデータレコードが存在し、挿入するデータに主キーまたは一意キーとの競合が存在する場合、REPLACE INTO ステートメントを使用して、テーブル内の競合する既存データを削除し、新しいデータに置換えることができます。
テーブル t_replace に1件レコードを挿入します。例:
obclient [test]> SELECT * FROM t_replace;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 2001 | 2022-10-13 14:06:58 |
| 2 | US | 2002 | 2022-10-13 14:17:56 |
| 7 | EN | 1007 | 2022-10-13 14:36:36 |
| 8 | JP | 1008 | 2022-10-13 14:36:36 |
+----+------+-------+---------------------+
4 rows in set
obclient [test]> REPLACE INTO t_replace(id, name, value, gmt_create) VALUES(2,'EN',2002,current_timestamp ());
Query OK, 2 rows affected
obclient [test]> SELECT * FROM t_replace;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 2001 | 2022-10-13 14:06:58 |
| 2 | EN | 2002 | 2022-10-13 14:44:33 |
| 7 | EN | 1007 | 2022-10-13 14:36:36 |
| 8 | JP | 1008 | 2022-10-13 14:36:36 |
+----+------+-------+---------------------+
4 rows in set
例では、テーブル t_replace の id 列は主キー列であり、一意性制約を満たす必要があります。挿入されたデータ (2,'EN',2002,current_timestamp ()) は一意性制約に違反しているため、システムは元の行レコード (2,'US',2002,current_timestamp ()) を削除し、新しい行レコードとして (2,'EN',2002,current_timestamp ()) を挿入します。