我的设置:
Mysql 和 PHP
系统场景:
我有超过 10 种类型的系统用户:例如:客户和员工
每次将客户或员工添加到系统时,系统都会根据当前日期自动生成每个用户的 ID。
例如(客户):
今天是2015年6月20日,该客户是第三个注册的客户。所以他的ID将是06202015-03。因此,每次用户(任何类型的用户)注册时序列号将仅在一天内递增 1。每隔一天序列计数器将返回到 0。
一般问题:鉴于我对 ID 生成的担忧已解决,预处理下一个序列 # 是否是一种好的做法?我的意思是系统只会拉出保存在数据库表上的下一个序列号?还是我应该只处理下一个序列号,直到新用户注册?
更新(添加了最佳可能方案):
示例日期:2015 年 6 月 20 日
-
客户 1 注册 = 生成的 ID 将为 06202015-01
-
客户 2 注册 = 生成的 ID 将为 06202015-02
等等...
注册期间最糟糕的情况:
- 2 个或更多用户以模拟方式注册 如果客户 1
- 在同一天被删除(由管理员)并且客户 2 注册,则客户 2 应获得 #1 ID (06202015-01),而不是 *-02,因为客户 1 已被删除。
.
我想知道有效生成序列号的最佳方法:
- 存储过程是否最适合此? 还是我应该使用 #2?(见下文)
- 每次用户注册时只处理下一个序列号(使用 PHP 函数)是否是一种好的做法?
#2 过程是我认为处理自动 ID 生成的最佳和更简单的方法,但我在想如果 2 个或更多用户怎么办同时唱歌?
在我的最新更新中,顺序显然是可以预测的。我唯一关心的是获取序列号的最佳或有效方法是什么。它是通过存储过程还是在所述最坏的情况下使用 php 脚本函数。
一般问题:鉴于我对 ID 生成的担忧已解决,预处理下一个序列 # 是否是一种好的做法?我的意思是系统只会拉出保存在数据库表上的下一个序列号?还是我应该只处理下一个序列号,直到新用户注册?
如果 ID 取决于用户注册的日期,则无法预测下一个 ID,因为您不知道下一个用户何时注册(除非您是千里眼)。
为了更容易地获取下一个值,我将 id 分成两列,一列包含日期,一列包含序列,然后您可以使用:
IFNULL((SELECT MAX(sequence) FROM usertable WHERE signup_date = CURRENT_DATE), 0) + 1
Imo没有最佳实践,这是个人喜好。还有第三个选项,插入前触发器。
为避免重复,请添加包含两列的唯一索引。
此外,您还可以锁定表:
LOCK TABLES user_table WRITE;
/* CALL(sproc) or INSERT statement, or SELECT and INSERT statements */
UNLOCK TABLES;
使用写锁定,在释放锁之前,没有其他会话可以访问该表(它将等待)