Updating and Inserting Data by Using the MERGE INTO Statement
To add all or a large amount of data in a table to an existing table, you can run the MERGE INTO statement in GaussDB to merge the two tables so that data can be quickly added to the existing table.
The MERGE INTO statement matches data in a source table with that in a target table based on a join condition. If data matches, UPDATE will be executed on the target table. Otherwise, INSERT will be executed. This statement is a convenient way to combine multiple operations and avoids multiple INSERT or UPDATE statements.
Prerequisites
You have the INSERT and UPDATE permissions for the target table and the SELECT permission for the source table.
Procedure
- Create a source table named products and insert data.
1 2 3 4 5 6 7 8 9 10 11
openGauss=# CREATE TABLE products ( product_id INTEGER, product_name VARCHAR2(60), category VARCHAR2(60) ); openGauss=# INSERT INTO products VALUES (1502, 'olympus camera', 'electrncs'), (1601, 'lamaze', 'toys'), (1666, 'harry potter', 'toys'), (1700, 'wait interface', 'books');
- Create a target table named newproducts and insert data.
1 2 3 4 5 6 7 8 9 10 11 12
openGauss=# CREATE TABLE newproducts ( product_id INTEGER, product_name VARCHAR2(60), category VARCHAR2(60) ); openGauss=# INSERT INTO newproducts VALUES (1501, 'vivitar 35mm', 'electrncs'), (1502, 'olympus ', 'electrncs'), (1600, 'play gym', 'toys'), (1601, 'lamaze', 'toys'), (1666, 'harry potter', 'dvd');
- Run the MERGE INTO statement to merge data in the source table products into the target table newproducts.
1 2 3 4 5 6 7
openGauss=# MERGE INTO newproducts np USING products p ON (np.product_id = p.product_id ) WHEN MATCHED THEN UPDATE SET np.product_name = p.product_name, np.category = p.category WHEN NOT MATCHED THEN INSERT VALUES (p.product_id, p.product_name, p.category) ;
For details on parameters in the statement, see Table 1. For more information, see MERGE INTO.
Table 1 Parameters in the MERGE INTO statement Parameter
Description
Example Value
INTO clause
Specifies a target table that is to be updated or has data to be inserted.
- A table alias is supported.
- The target table can be copied, but the copied table cannot contain columns (such as auto-increment columns) that contain volatile functions. If enable_stream_operator is set to off, the target replication table must contain a primary key or a column must meet the unique not null constraint.
Value: newproducts np
The table name is newproducts and the alias is np.
USING clause
Specifies a source table. A table alias is supported.
If the target table is a replication table, the source table must also be a replication table.
Value: products p
The table name is products and the alias is p.
ON clause
Specifies a join condition between a target table and a source table.
Columns in the join condition cannot be updated.
Value: np.product_id = p.product_id
The join condition is that the product_id column in the target table newproducts has equivalent values as the product_id column in the source table products.
WHEN MATCHED clause
Performs UPDATE if data in the source table matches that in the target table based on the condition.
- Only one WHEN MATCHED clause can be specified.
- The WHEN MATCHED clause can be omitted. If it is omitted, no operation will be performed on the rows that meet the condition in the ON clause.
- Columns involved in the distribution key of the target table cannot be updated.
Value: WHEN MATCHED THEN UPDATE SET np.product_name = p.product_name, np.category = p.category
When the condition in the ON clause is met, the values of the product_name and category columns in the target table newproducts are replaced with the values in the corresponding columns in the source table products.
WHEN NOT MATCHED clause
Performs INSERT if data in the source table does not match that in the target table based on the condition.
Value: WHEN NOT MATCHED THEN
INSERT VALUES (p.product_id, p.product_name, p.category)
Insert rows in the source table products that do not meet the condition in the ON clause into the target table products.
- Query the target table newproducts after the merge.
1
openGauss=# SELECT * FROM newproducts;
The command output is as follows:
product_id | product_name | category ------------+----------------+----------- 1501 | vivitar 35mm | electrncs 1502 | olympus camera | electrncs 1666 | harry potter | toys 1600 | play gym | toys 1601 | lamaze | toys 1700 | wait interface | books (6 rows)
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.See the reply and handling status in My Cloud VOC.
For any further questions, feel free to contact us through the chatbot.
Chatbot