在MySQL中,使用時間序列號生成ID是一種較為常見的方式。這種方法可以在保證唯一性的同時,又能夠很好地保證查詢和排序的效率。
CREATE TABLE `user` ( `id` bigint unsigned NOT NULL COMMENT 'ID', `name` varchar(32) NOT NULL COMMENT '姓名', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';
在上述的user表中,我們要生成一個唯一的ID作為主鍵。
ALTER TABLE `user` ADD `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間';
在表中添加一個datetime類型的create_time字段,用于記錄數據生成的時間。
ALTER TABLE `user` ADD `seq` bigint unsigned NOT NULL DEFAULT '0' COMMENT '時間序列號';
在表中添加一個bigint類型的seq字段,用于存儲時間序列號。
delimiter ;; CREATE TRIGGER user_insert BEFORE INSERT ON user FOR EACH ROW BEGIN SET new.seq = (UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP('2021-01-01 00:00:00'))<< 22; END;; delimiter ;
上述代碼是一個MySQL觸發器,用于在每次插入數據時自動生成時間序列號。觸發器中的時間起點為2021-01-01 00:00:00,左移22位是為了將時間序列號放在bigint的高位上。
實例:
INSERT INTO `user` (`id`, `name`) VALUES (1, '張三');
執行上述代碼后,我們可以在數據表中查看到生成的ID和時間序列號:
id name create_time seq 1 張三 2021-08-30 08:58:26 2031967073813504
上述的時間序列號是由當前時間計算得到的,如果需要更加精準的時間戳可以使用PHP的microtime()函數,將時間序列號計算出來后插入數據庫中即可。