REPLACE
REPLACE INTO は、以下のデータソースを使用して、テーブルに複数の新しい行を挿入することも、行がすでに存在する場合は既存の行を更新することもできます。
直接値
クエリ結果
stage 上のファイル: TiDB Cloud Lake では、REPLACE INTO 文を使用して stage 上のファイルからテーブル内のデータを置き換えることができます。これは、TiDB Cloud Lake の Query Staged Files 機能を使用して stage 上のファイルをクエリし、その結果をテーブルに取り込むことで実現されます。
構文
REPLACE INTO <table_name> [ ( <col_name> [ , ... ] ) ]
ON (<CONFLICT KEY>) ...
REPLACE INTO は、指定した競合キーがテーブル内で見つかった場合は既存の行を更新し、競合キーが存在しない場合は新しい行を挿入します。競合キーとは、テーブル内の行を一意に識別するカラム、または複数カラムの組み合わせであり、REPLACE INTO 文を使用して新しい行を挿入するか既存の行を更新するかを判断するために使用されます。以下の例を参照してください。
CREATE TABLE employees (
employee_id INT,
employee_name VARCHAR(100),
employee_salary DECIMAL(10, 2),
employee_email VARCHAR(255)
);
-- This REPLACE INTO inserts a new row
REPLACE INTO employees (employee_id, employee_name, employee_salary, employee_email)
ON (employee_email)
VALUES (123, 'John Doe', 50000, 'john.doe@example.com');
-- This REPLACE INTO updates the inserted row
REPLACE INTO employees (employee_id, employee_name, employee_salary, employee_email)
ON (employee_email)
VALUES (123, 'John Doe', 60000, 'john.doe@example.com');
分散 REPLACE INTO
REPLACE INTO は、クラスター環境での分散実行をサポートしています。分散 REPLACE INTO を有効にするには、ENABLE_DISTRIBUTED_REPLACE_INTO を 1 に設定します。これにより、クラスター環境でのデータロードのパフォーマンスとスケーラビリティを向上させることができます。
SET enable_distributed_replace_into = 1;
例
例 1: 直接値による置換
この例では、直接値を使用してデータを置き換えます。
CREATE TABLE employees(id INT, name VARCHAR, salary INT);
REPLACE INTO employees (id, name, salary) ON (id)
VALUES (1, 'John Doe', 50000);
SELECT * FROM Employees;
+------+----------+--------+
| id | name | salary |
+------+----------+--------+
| 1 | John Doe | 50000 |
+------+----------+--------+
例 2: クエリ結果による置換
この例では、クエリ結果を使用してデータを置き換えます。
CREATE TABLE employees(id INT, name VARCHAR, salary INT);
CREATE TABLE temp_employees(id INT, name VARCHAR, salary INT);
INSERT INTO temp_employees (id, name, salary) VALUES (1, 'John Doe', 60000);
REPLACE INTO employees (id, name, salary) ON (id)
SELECT id, name, salary FROM temp_employees WHERE id = 1;
SELECT * FROM Employees;
+------+----------+--------+
| id | name | salary |
+------+----------+--------+
| 1 | John Doe | 60000 |
+------+----------+--------+
例 3: stage 上のファイルによる置換
この例では、stage 上のファイルのデータを使用して、テーブル内の既存データを置き換える方法を示します。
sampleという名前のテーブルを作成しますCREATE TABLE sample ( id INT, city VARCHAR, score INT, country VARCHAR DEFAULT 'China' ); INSERT INTO sample (id, city, score) VALUES (1, 'Chengdu', 66);サンプルデータを含む内部 stage を設定します
まず、
mystageという名前の stage を作成します。次に、この stage にサンプルデータをロードします。CREATE STAGE mystage; COPY INTO @mystage FROM ( SELECT * FROM ( VALUES (1, 'Chengdu', 80), (3, 'Chongqing', 90), (6, 'Hangzhou', 92), (9, 'Hong Kong', 88) ) ) FILE_FORMAT = (TYPE = PARQUET);REPLACE INTOを使用して、stage 上の Parquet ファイルから既存データを置き換えますREPLACE INTO sample (id, city, score) ON (Id) SELECT $1, $2, $3 FROM @mystage (FILE_FORMAT => 'parquet');データの置換を確認します
これで、sample テーブルをクエリして変更内容を確認できます。
SELECT * FROM sample;
結果は次のようになります。
┌─────────────────────────────────────────────────────────────────────────┐
│ id │ city │ score │ country │
│ Nullable(Int32) │ Nullable(String) │ Nullable(Int32) │ Nullable(String) │
├─────────────────┼──────────────────┼─────────────────┼──────────────────┤
│ 1 │ Chengdu │ 80 │ China │
│ 3 │ Chongqing │ 90 │ China │
│ 6 │ Hangzhou │ 92 │ China │
│ 9 │ Hong Kong │ 88 │ China │
└─────────────────────────────────────────────────────────────────────────┘