更新时间:2025-10-11 GMT+08:00
        
          
          
        
      
      
      
      
      
      
      
      
  
      
      
      
        
UPSERT
功能描述
HStore opt兼容UPSERT语法,向表中添加一行或多行数据。当出现主键或者唯一约束冲突时更新或者忽略冲突的数据。
注意事项
- 目标表上必须包含主键或者唯一索引才可以执行UPSERT的冲突更新语句。
 - 与列存一样,当UPSERT触发更新操作时,当前版本HStore opt上的更新操作始终先DELETE再INSERT。
 - 对于并发UPSERT场景,传统列存储格式由于同时操作相同CU时会产生锁冲突所以并发性能较差,对于HStore opt表由于不需要阻塞等待,并发UPSERT性能可达到列存的百倍以上。
 
语法格式
| 
         语法格式  | 
       
         冲突更新  | 
       
         冲突忽略  | 
      
|---|---|---|
| 
         第一种:不指定索引  | 
       
        INSERT INTO ON DUPLICATE KEY UPDATE  | 
       
        INSERT IGNORE INSERT INTO ON CONFLICT DO NOTHING  | 
      
| 
         第二种:从指定列名或者约束上可以推断唯一约束  | 
       
        INSERT INTO ON CONFLICT(...) DO UPDATE SET INSERT INTO ON CONFLICT ON CONSTRAINT con_name DO UPDATE SET  | 
       
        INSERT INTO ON CONFLICT(...) DO NOTHING INSERT INTO ON CONFLICT ON CONSTRAINT con_name DO NOTHING  | 
      
参数说明
第一种不指定索引。会在所有主键或唯一索引上检查冲突,有冲突就会忽略或者更新。
第二种指定索引。会从ON CONFLICT子句中指定列名、包含列名的表达式或者约束名上推断主键或者唯一索引。
- WHERE子句 
     
- 用于在数据冲突时,判断是否满足指定条件。如果满足,则更新冲突数据。否则忽略。
 - 只有第二种语法形式的冲突更新语法可以指定WHERE子句。即INSERT INTO ON CONFLICT(...) DO UPDATE SET WHERE
 
 
示例
    创建表reason_upsert并向表中插入数据: 
    
     
      
       
        
     
    
   
   
          1 2 3 4 5 6 7  | 
         
          CREATE TABLE reason_upsert ( a int primary key, b int, c int )WITH(ORIENTATION=COLUMN, ENABLE_HSTORE_OPT=ON); INSERT INTO reason_upsert VALUES (1, 2, 3);  | 
        
    忽略冲突的数据: 
    
     
      
       
        
     
    
   
   
          1
           | 
         
          INSERT INTO reason_upsert VALUES (1, 4, 5),(2, 6, 7) ON CONFLICT(a) DO NOTHING;  | 
        
    更新冲突的数据: 
    
     
      
       
        
     
    
   
  
          1
           | 
         
          INSERT INTO reason_upsert VALUES (1, 4, 5),(3, 8, 9) ON CONFLICT(a) DO UPDATE SET b = EXCLUDED.b, c = EXCLUDED.c;  |