一、oracle為什么不提供CREATE TABLE IF NOT EXIST方式創建表
因為系統設定語法就這樣,后面只能先跟文件名,然后再跟條件。但寫腳本時可以每次先drop ,再create。 寫個塊判斷也行。使用了oracle的保留字size和rows,不能用來作為列名,把他改成別的吧,比如items_size,items_rows,不然以后調用也很麻煩。
mysql的CREATE TABLE IF NOT EXISTS 方法
DROP TABLE IF EXISTS ci_sessions;
CREATE TABLE IF NOT EXISTS ci_sessions (
?? session_id VARCHAR(40) NOT NULL DEFAULT ‘0’,
?? peopleid INT(11) NOT NULL,
?? ip_address VARCHAR(16) NOT NULL DEFAULT ‘0’,
?? user_agent VARCHAR(50) NOT NULL,
?? last_activity INT(10) UNSIGNED NOT NULL DEFAULT ‘0’,
?? LEFT INT(11) NOT NULL,
?? name VARCHAR(25) NOT NULL,
?? status TINYINT(4) NOT NULL DEFAULT ‘0’
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
延伸閱讀:
二、MVCC多版本并發控制機制的實現
undo日志版本鏈是指一行數據被多個事務依次修改過后,在每個事務修改完后,Mysql會保留修改前的數據undo回滾日志,并且用兩個隱藏字段trx_id和roll_pointer把這些undo日志串聯起來形成一個歷史記錄版本鏈。
在可重復讀隔離級別,當事務開啟,執行任何查詢sql時會生成當前事務的一致性視圖read-view該視圖在事務結束之前都不會變化(如果是讀已提交隔離級別在每次執行查詢sql時都會重新生成)該視圖由執行查詢時所有未提交事務id數組(數組里最小的id為min_id)和已創建的最大事務id(max_id)組成事務里任何sql的查詢結果需要從對應版本鏈里的最新數據開始逐條跟read-view做比對從而得到最終的快照結果1.如果 row 的 trx_id 落在綠色部分( trx_id 2. 如果 row 的 trx_id 落在紅色部分( trx_id>max_id ),表示這個版本是由將來啟動的事務生成的,是不可見的(若 row 的 trx_id 就是當前自己的事務是可見的); 3. 如果 row 的 trx_id 落在黃色部分(min_id <=trx_id<= max_id),那就包括兩種情況: 若 row 的 trx_id 在視圖數組中,表示這個版本是由還沒提交的事務生成的,不可見(若 row 的 trx_id 就是當前自己的事務,是可見的); 若 row 的 trx_id 不在視圖數組中,表示這個版本是已經提交了的事務生成的,可見。