1. 程式人生 > >關於考勤資料的思考(MySQL)

關於考勤資料的思考(MySQL)

最近考勤系統老是出錯,不知道公司考勤是怎麼做的。因為自己對MySQL用的也不多,這裡根據自己的想法參考了別人的部落格,加上自己的驗證。學到了一些收穫,在這裡記下來。

資料庫索引

  • 主鍵: 資料庫innodb引擎支援不顯式指定主鍵,但是會預設建立一個使用者不可見的主鍵。
  • 聯合索引 聯合索引可以是唯一索引,是多個key的聯合。
  • on duplicate key 這是資料庫插入時主鍵或者唯一索引衝突時會具有這個事件

想法與設計

考勤系統最關心的是簽到與簽退,這裡簽到是第一次打卡的時間,簽退是最後一次打卡的時間。 這裡我們不關心中間打了多少次卡,只記錄第一次和最後一次的時間。所以簽到只能是“insert ignore into”,簽退是“insert into … on duplicate update time=now()”。這裡建立表的時候不能指定 primary key,否則主鍵衝突會發生,從而覆蓋簽到的值。我們想到的是依靠“uid,批次”作為唯一索引,如果同一天的同一批次有衝突,則更新。

驗證

下面是建表操作的一些語句,day指定的是日期、batch指定上下班、time指定具體時間,因為只做驗證,語句比較簡陋:

建表語句
create table schedule (day int not null, batch int not null, time text not null);
建立唯一索引
create unique index u_idx on schedule(day, batch);
每打一次卡都會執行下面兩條語句
insert ignore into schedule (day, batch, time)values (20180911, 0, now());
insert into schedule (day, batch, time) values (20180911, 1, "1" ) on duplicate key update time=now();

驗證結果正確,這裡就不貼圖了。