為存儲引擎添加對UPDATE的支持 |
發布時間: 2012/8/23 16:49:37 |
通過執行表掃描操作,在找到與UPDATE語句的WHERE子句匹配的行后,MySQL服務器將執行UPDATE語句,然后調用update_row()函數:
int ha_foo::update_row(const byte *old_data, byte *new_data)
*old_data參數包含更新前位于行中的數據,而*new_data參數包含行的新內容(采用MySQL內部行格式)。 更新的執行取決于行格式和存儲實施方式。某些存儲引擎將替換恰當位置的數據,而其他實施方案則會刪除已有的行,并在數據文件末尾添加新行。
非事務性存儲引擎通常會忽略*old_data參數的內容,僅處理*new_data緩沖。事務性存儲引擎可能需要比較緩沖,以確定在上次回滾中出現了什么變化。
如果正在更新的表中包含時間戳列,對時間戳的更新將由update_row()調用管理。下述示例來自CSV引擎:
int ha_tina::update_row(const byte * old_data, byte * new_data)
{
int size;
DBUG_ENTER("ha_tina::update_row");
電腦技術www.boydavid.com
statistic_increment(table->in_use->status_var.ha_read_rnd_next_count, 電腦技術www.boydavid.com
&LOCK_status); 電腦技巧www.boydavid.com
if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE) 計算機學習網站www.boydavid.com
table->timestamp_field->set_time();
size= encode_quote(new_data);
if (chain_append())
DBUG_RETURN(-1);
if (my_write(share->data_file, buffer.ptr(), size, MYF(MY_WME | MY_NABP)))
DBUG_RETURN(-1);
DBUG_RETURN(0);
} 電腦學習網站www.boydavid.com
請注意上例中的時間戳設置。 本文出自:億恩科技【www.laynepeng.cn】 |