MERGE INTO

    • 进行MERGE INTO操作的用户需要同时拥有目标表的UPDATE和INSERT权限,以及源表的SELECT权限。
    • 不支持重分布过程中MERGE INTO。
    • INTO子句

      指定正在更新或插入的目标表。目标表为复制表时,暂不支持目标表中某列默认值为volatile函数(如自增列),enable_stream_operator=off时目标表需要包含主键或带有unique not null。

      • talbe_name

        目标表的表名。

      • alias

        目标表的别名。

        取值范围:字符串,符合标识符命名规范。

    • 指定源表,源表可以为表、视图或子查询。目标表为复制表时,暂不支持USING子句中包含非复制表。

    • ON子句

      关联条件,用于指定目标表和源表的关联条件。不支持更新关联条件中的字段。

    • WHEN MATCHED子句

      当源表和目标表中数据针对关联条件可以匹配上时,选择WHEN MATCHED子句进行UPDATE操作。

      不支持更新分布列。不支持更新系统表、系统列。

    • WHEN NOT MATCHED子句

      不支持INSERT子句中包含多个VALUES。

      WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省,不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。

    • DEFAULT

      用对应字段的缺省值填充该字段。

      如果没有缺省值,则为NULL。

    • WHERE condition

      UPDATE子句和INSERT子句的条件,只有在条件满足时才进行更新操作,可缺省。不支持WHERE条件中引用系统列。

    1. postgres=# CREATE TABLE products
    2. (
    3. product_id INTEGER,
    4. product_name VARCHAR2(60),
    5. );
    6. postgres=# INSERT INTO products VALUES (1501, 'vivitar 35mm', 'electrncs');
    7. postgres=# INSERT INTO products VALUES (1502, 'olympus is50', 'electrncs');
    8. postgres=# INSERT INTO products VALUES (1600, 'play gym', 'toys');
    9. postgres=# INSERT INTO products VALUES (1601, 'lamaze', 'toys');
    10. postgres=# INSERT INTO products VALUES (1666, 'harry potter', 'dvd');
    11. postgres=# CREATE TABLE newproducts
    12. (
    13. product_id INTEGER,
    14. category VARCHAR2(60)
    15. );
    16. postgres=# INSERT INTO newproducts VALUES (1502, 'olympus camera', 'electrncs');
    17. postgres=# INSERT INTO newproducts VALUES (1601, 'lamaze', 'toys');
    18. postgres=# INSERT INTO newproducts VALUES (1666, 'harry potter', 'toys');
    19. postgres=# INSERT INTO newproducts VALUES (1700, 'wait interface', 'books');
    20. -- 进行MERGE INTO操作
    21. USING newproducts np
    22. ON (p.product_id = np.product_id)
    23. WHEN MATCHED THEN
    24. UPDATE SET p.product_name = np.product_name, p.category = np.category WHERE p.product_name != 'play gym'
    25. WHEN NOT MATCHED THEN
    26. INSERT VALUES (np.product_id, np.product_name, np.category) WHERE np.category = 'books';
    27. -- 查询更新后的结果
    28. postgres=# SELECT * FROM products ORDER BY product_id;
    29. product_id | product_name | category
    30. ------------+----------------+-----------
    31. 1501 | vivitar 35mm | electrncs
    32. 1502 | olympus camera | electrncs
    33. 1600 | play gym | toys
    34. 1601 | lamaze | toys
    35. 1666 | harry potter | toys
    36. 1700 | wait interface | books
    37. (6 rows)
    38. -- 删除表
    39. postgres=# DROP TABLE newproducts;