我們在使用資料庫的過程中幾乎所有表都會有幾個欄位是必須存在的。它們與業務無關,但是可以幫助我們追溯記錄簡單的插入和更新過程,是"輔助"一般的存在。
字段備註
id主鍵,在單資料庫下由資料庫自增實現,用來追蹤記錄
creator
記錄建立者,用於跟蹤記錄建立人
updator
記錄更新更新人,用於追蹤記錄更新人
create_time
建立時間,用於追蹤記錄建立時間
update_time
更新時間,用於追蹤記錄更新時間
del邏輯刪除字段,用於標記記錄是否已經被刪除
這裡我們介紹一下輔助中的特殊字段–時間相關的字段。
這個字段一般用於追蹤記錄的建立時間,在插入記錄時會將當前時間記錄在該字段上,我們可以在建表是給它定義乙個預設值。
create_time timestamp
notnull
default
current_timestamp
這個字段一般用於追蹤記錄的更新時間,與建立時間一樣它一般與業務邏輯無關,當記錄發生更新操作時需要同時更新該欄位,我們同樣不希望這個欄位的更新操作交給我們業務**。那麼就在建表是設定讓它自己更新吧。
-- 表明該欄位非空,預設值為當前時間戳,並且在更新操作時同時更新該字段為當前時間戳
update_time timestamp
notnull
default
current_timestamp
onupdate
current_timestamp
-- 這裡新建一張使用者表,只有乙個 name 的業務字段,其餘都是審計字段
create
table
user
( id int(11
)not
null
auto_increment
primary
key,
name varchar
(255),
create_time timestamp
notnull
default
current_timestamp
, update_time timestamp
notnull
default
current_timestamp
onupdate
current_timestamp
, creator varchar
(255
)not
null
, updator varchar
(255
)not
null
, del varchar
(255
)not
null
default
'n')
engine
="innodb"
,charset
="utf8mb4"
;
關於del
欄位的思考
之前遇到過乙個場景,是有關 del 邏輯刪除 和唯一索引衝突的問題,我有記錄是通過邏輯刪除刪掉了,但是這條記錄實際上還是存在的。當我想要重新插入這條資料的時候由於原來被刪除的資料還在導致新的資料被唯一索引限制住了插不進去。當然我們這裡可以使用replace into
的方式將原來的資料刪除後插入 或者insert for update
插入時條件更新。
但是如果我既想要留住原來已經被邏輯刪除的資料,又想插入新的記錄使兩者不發生衝突怎麼辦?
解決方式是唯一索引中加入del
審計字段,使得唯一的判定範圍擴大。
比如上面那張表,我希望在name
字段 上建立唯一索引。並插入記錄。
-- 在 user 表的 name 欄位上建立索引
create
unique
index uk_name on
user
(name)
;-- 插入一條記錄
insert
into
user
(name,creator,updator)
values
("張三"
,"ghimi"
,"ghimi");
-- 邏輯刪除該記錄
update
user
set del=
'y'where id=1;
-- 重新插入該記錄時會報錯
insert
into
user
(name,creator,updator)
values
("張三"
,"ghimi"
,"ghimi");
-- 為了保證唯一索引和邏輯刪除欄位不衝突,我們需要在該錶的所有唯一索引中加入 del 審計字段
drop
index
ifexists uk_name on
user
;create
unique
index uk_name_del on
user
(name,del)
;-- 同時邏輯刪除修改為
update
user
set del=concat(
'y-'
,now()
)where id=1;
-- 這樣再次插入相同的記錄的時候就不會報唯一索引錯誤了
mysql建表規範
create table dbname bodyguard black box id int 11 not null auto increment,login id varchar 64 default null comment 使用者登入賬號,手機號 bize code varchar 64 de...
Mysql 建表及查詢規範
int 如無特殊需要,存放整型數字使用unsigned int型。整型欄位後的數字代表顯示長度。整型型別如下表 資料型別 最大儲存長度 有符號 最大儲存長度 無符號 tinyint m 1個位元組 範圍 128 127 1個位元組 範圍 0 256 smallint m 2個位元組 範圍 32768...
MySQL學習之建表規範
資料型別盡量用數字型別,數字型別的比字元型別的要快很多,比如使用int unsigned儲存ip 大資料字段最好剝離出單獨的表,以便影響效能 使用varchar,代替char,這是因為varchar會動態分配長度資料型別盡量小,這裡的盡量小是指在滿足可以預見的未來需求的前提下的,但是有不能太小,所以...