天天看點

Hypertable在Delete指令後執行Insert指令時應該注意的問題

      Delete指令适用于一個單獨的row,對于指定的row,它可以删除一個CQ的所有CELL,一個CF的所有CELL,或者一個row的所有CELL。如果指定了TIMESTAMP子句,将會删除TIMESTAMP小于或者等于給定值的CELL。否則,将自動配置設定目前時間作為TIMESTAMP子句。

      Delete在删除時,将會插入一個删除标記,即此時為邏輯删除。删除标記持久的存在于庫中,除非一個major compaction操作發生,此時将執行實體删除。删除标記将會删除同一row下,TIMESTAMP早于删除标記對應的TIMESTAMP的記錄。

      如果在執行了Delete指令後,再執行Insert指令,并且Insert指令中的TIMESTAMP小于Delete指令中的TIMESTAMP,則會出現不能插入的情況。例如:

delete * from test where row = "row1" TIMESTAMP “2012-11-11 00:00:00”   或者  delete * from test where row = "row1"  //TIMESTAMP 預設為目前時間,假設目前時間為 “2012-11-11 00:00:00” ;

insert into test values ("2012-11-10 00:00:00", "row1", "foo", "bar")    //此CELL不能被插入;

      當然,如果Insert指令不帶TIMESTAMP的話,則應該可以正常執行,因為Insert時的TIMESTAMP預設為目前時間,其應該晚于Delete指令中的TIMESTAMP。