3.2.2 REPLACE

3.2.2.1 Syntax

正常情况下,REPLACE只支持下面2种写法。

REPLACE 
    [INTO] tbl_name
    [(col_name [, col_name] ...)]
    {VALUES | VALUE} (value_list) [, (value_list)] ...

REPLACE 
    [INTO] tbl_name
    SET assignment_list

value:
    {expr | DEFAULT}

value_list:
    value [, value] ...


assignment:
    col_name = value

assignment_list:
    assignment [, assignment] ...

特殊情况下,支持下面这种写法。特殊场景参看下文细节

REPLACE 
    [INTO] tbl_name
    [(col_name [, col_name] ...)]
    {SELECT ... | TABLE table_name}

3.2.1.2 与MySQL语法区别

下文中红色表示不支持的语法或关键字

REPLACE 
-   [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
-   [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
-   { 
     {VALUES | VALUE} (value_list) [, (value_list)] ...
-    |VALUES row_constructor_list
-   }

REPLACE 
-   [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
-   [PARTITION (partition_name [, partition_name] ...)]
    SET assignment_list

REPLACE 
-   [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
-   [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    {SELECT ... | TABLE table_name} 

value:
    {expr | DEFAULT}

value_list:
    value [, value] ...

-row_constructor_list:
-   ROW(value_list)[, ROW(value_list)][, ...]

assignment:
    col_name = value 

assignment_list:
    assignment [, assignment] ...

3.2.2.3 举例

REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
REPLACE INTO test set id = 1, type= 'Old',create_date =  '2014-08-20 18:47:00';

3.2.2.4 限制

  • 由于replace的语义为如果存在则替换,如果不存在则新增,所以在使用表格自增主键的时候,如果对于自增表格使用replace且ID不存在,那么就会插入一条指定ID的数据,并不会自动生成ID
  • 存在特例,当insert/replace... select语句满足以下条件时,dble会在确保数据安全性的情况下对于SQL进行下发执行
    • 当插入目标是单节点表时,要求所有数据来源的表格都有明确的路由信息路由到同一节点
    • 当插入目标是全局表时,要求所有的数据来源表格都是全局表,并且路由范围能够覆盖插入目标
    • 当插入目标是分片表时,要求分片列的数据直接来源自拥有同样分片逻辑的分片表,并且对于select子查询中间的其他表格,要求能够子查询部分路由结果能整体下发,并且逻辑上无错误

results matching ""

    No results matching ""