Oracle兼容-语法-UPDATE … SET


1. 语法

  1. SET sql_mode = ORACLE;
  2. UPDATE [LOW_PRIORITY] [IGNORE] table_reference
  3. SET (assignment_list) = (var_list)
  4. [WHERE where_condition]
  5. [ORDER BY ...]
  6. [LIMIT row_count]
  7. UPDATE [LOW_PRIORITY] [IGNORE] table_reference
  8. SET (assignment_list) = (SELECT stmt)
  9. [WHERE where_condition]
  10. [ORDER BY ...]
  11. [LIMIT row_count]

需要先切换到 ORACLE 模式下才能支持本语法。

2. 定义和用法

在GeratSQL中,支持执行 UPDATE ... SET 同时更新多表,类似Oracle用法。主要有以下两种形式:

  • 用法1,多表更新

UPDATE t1, t2 ... tn SET(column1,column2) = (value1, value2)

这种写法支持同时更新多表中的同名多列。

  • 用法2,单表更新,更新值源自子查询

UPDATE TABLE t1 SET(a,b) = (SELECT * FROM t2) WHERE

这种用法只支持更新单表,且只支持单条SELECT语句赋值,不支持多个SELECT语句,与Oracle行为一致。

3. Oracle兼容说明

在Oracle中不支持上述提到的 用法1,即同时更新多表,只有在GreatSQL中才支持。

4. 示例

创建测试表并初始化数据:

  1. greatsql> CREATE TABLE t1 (c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, c2 VARCHAR(10) NOT NULL, c3 VARCHAR(10) NOT NULL);
  2. greatsql> CREATE TABLE t2 LIKE t1;
  3. greatsql> INSERT INTO t1 VALUES (1, 'rt1c2', 'rt1c3');
  4. greatsql> INSERT INTO t2 VALUES (1, 'rt2c2', 'rt2c3');
    1. 示例1:多表更新
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> UPDATE t2, t1 SET (t2.c1, t1.c1) = (2, 9);
  3. Query OK, 2 rows affected (0.00 sec)
  4. Rows matched: 2 Changed: 2 Warnings: 0
  5. greatsql> SELECT * FROM t1;
  6. +----+-------+-------+
  7. | c1 | c2 | c3 |
  8. +----+-------+-------+
  9. | 9 | rt1c2 | rt1c3 |
  10. +----+-------+-------+
  11. greatsql> SELECT * FROM t2;
  12. +----+-------+-------+
  13. | c1 | c2 | c3 |
  14. +----+-------+-------+
  15. | 2 | rt2c2 | rt2c3 |
  16. +----+-------+-------+
    1. 示例2:更新值源自子查询
  1. greatsql> SET sql_mode = ORACLE;
  2. -- 这么写也是可以的
  3. -- UPDATE t1 SET (c1, c2 ,c3) = (SELECT * FROM t2 WHERE c1 = 2) WHERE t1.c1 = 9;
  4. greatsql> UPDATE t1 SET (t1.c1, t1.c2, t1.c3) = (SELECT t2.c1, t2.c2, t2.c3 FROM t2 WHERE t2.c1 = 2) WHERE t1.c1 = 9;
  5. Query OK, 1 row affected (0.00 sec)
  6. Rows matched: 1 Changed: 1 Warnings: 0
  7. greatsql> SELECT * FROM t1;
  8. +----+-------+-------+
  9. | c1 | c2 | c3 |
  10. +----+-------+-------+
  11. | 2 | rt2c2 | rt2c3 |
  12. +----+-------+-------+
  13. greatsql> SELECT * FROM t2;
  14. +----+-------+-------+
  15. | c1 | c2 | c3 |
  16. +----+-------+-------+
  17. | 2 | rt2c2 | rt2c3 |
  18. +----+-------+-------+
    1. 示例3:更新值源自子查询
  1. -- t1, t2表重新初始化
  2. greatsql> TRUNCATE TABLE t1;
  3. greatsql> INSERT INTO t1 VALUES (1, 'rt1c21', 'rt1c31');
  4. greatsql> TRUNCATE TABLE t2;
  5. greatsql> INSERT INTO t2 VALUES (1, 'rt2c21', 'rt2c31'),
  6. (2, 'rt2c22', 'rt2c32'),
  7. (3, 'rt2c23', 'rt2c33');
  8. greatsql> SET sql_mode = ORACLE;
  9. -- 相比用法2,少了最后t1表上的WHERE条件
  10. greatsql> UPDATE t1 SET(c2, c3) = (SELECT c2, c3 FROM t2 WHERE c1 = 3);
  11. Query OK, 3 rows affected (0.00 sec)
  12. Rows matched: 3 Changed: 3 Warnings: 0
  13. greatsql> SELECT * FROM t1;
  14. +----+--------+--------+
  15. | c1 | c2 | c3 |
  16. +----+--------+--------+
  17. | 1 | rt2c23 | rt2c33 |
  18. | 2 | rt2c23 | rt2c33 |
  19. | 3 | rt2c23 | rt2c33 |
  20. +----+--------+--------+

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx