MySQL 建表審計字段規範用法

2021-10-21 21:03:06 字數 2802 閱讀 8493

我們在使用資料庫的過程中幾乎所有表都會有幾個欄位是必須存在的。它們與業務無關,但是可以幫助我們追溯記錄簡單的插入和更新過程,是"輔助"一般的存在。

字段備註

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會動態分配長度資料型別盡量小,這裡的盡量小是指在滿足可以預見的未來需求的前提下的,但是有不能太小,所以...