Php 如何基于模式创建唯一ID
我正在进行一个学生数据库项目,在这个项目中,我必须根据模式生成一个唯一的13位ID(在数据库中,而不是通用的唯一ID) 模式 模式如下:前四位是州代码,后两位是学生入学年份,其余7位是简单的顺序代码,如0103115000001 问题 我不能使用mysql的自动递增功能,因为序列号必须独立于州代码和注册年份Php 如何基于模式创建唯一ID,php,mysql,unique-id,Php,Mysql,Unique Id,我正在进行一个学生数据库项目,在这个项目中,我必须根据模式生成一个唯一的13位ID(在数据库中,而不是通用的唯一ID) 模式 模式如下:前四位是州代码,后两位是学生入学年份,其余7位是简单的顺序代码,如0103115000001 问题 我不能使用mysql的自动递增功能,因为序列号必须独立于州代码和注册年份 为了说明清楚,考虑到我只有三个状态代码表示A=0101,状态B=0102,状态C=0103,假设我们在2015年产生ID,所以两位数年代码将是15。p> 现在的问题是,在A州录取的第一名学生
为了说明清楚,考虑到我只有三个状态代码表示A=0101,状态B=0102,状态C=0103,假设我们在2015年产生ID,所以两位数年代码将是15。p> 现在的问题是,在A州录取的第一名学生的ID应为0101150000001,同样地,B州的第一名学生的ID应为0102150000001,C州的第一名学生的ID应为0103150000001,并且这些顺序应按照与其他州无关的顺序继续
每年都必须重新启动序列,这一事实也使问题变得复杂。例如,2016年A州的第一名学生应获得ID 01011600001。更糟糕的是,过去的学生记录将被随机输入数据库,这意味着可能有一个学生的入学日期是2015年,这样的条目后面可能是一个入学日期是1998年的学生,后面可能是一个入学日期是2014年的学生,依此类推 我想说的是,数据输入不会按年度排序,因此无法每年重置自动增量字段 每个州每年的顺序必须保持开放或永远持续 虽然我可以为每个州每年使用单独的ID生成表来管理它,但我想知道是否有更专业的方法来高效地生成和管理此类ID 请不要将其标记为副本,因为我已经在您的论坛和谷歌上搜索过,但找不到任何相关内容。谢谢顺便说一下,我必须用MySql和PHP实现它 结构目前,我需要将学生的数据存储在一个表中。将有诸如ID、名字、姓氏、地址、亲子关系等属性。将有其他表格包含有关学校和其他实体以及它们之间关系的数据。我把一切都准备好了。问题只是ID的问题。为此,我需要一个可靠的ID生成算法。即使在同一秒钟内同时生成数千个条目,该算法也不应生成两个类似的ID。最简单的解决方案是类似于以下内容的表设计 首先创建一个主表来填充学生记录;这只使用
student\u id
,但实际上会包含诸如姓名等其他详细信息
CREATE TABLE IF NOT EXISTS `students` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`student_id` BIGINT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTOINCREMENT=0;
现在您将拥有一对一中间表,其中包含状态代码的字段,入学日期和唯一id。通过这样设计,您可以使用一种简单的方法实现递归函数,该函数将根据每个引用的学生id
记录处理标识符
字段的顺序值。哦,我把年份代码改为处理INT(4)
(y2k bug太多了)&将七位标识符扩展为BIGINT
,以处理增长
CREATE TABLE IF NOT EXISTS `student_ids` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`student_id` BIGINT NOT NULL,
`state` INT(4) NOT NULL,
`year` INT(4) NOT NULL,
`identifier` BIGINT NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_students2student_ids` FOREIGN KEY (`student_id`)
REFERENCES `students`(`id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=0;
现在是一个递归函数,用于组合并确定标识符
的每个组合的状态
+年份
+标识符
<?php //pseudo-code, not tested
$states = array(0101, 0102, 0103);
$years = array(1999, 2000, 2001, 2002);
function robot_do_work() {
foreach ($states as $st) {
foreach ($years as $yr) {
// Create PDO SQL statement
$handle = $conn->pdo->prepare('SELECT SUM(MAX(`identfier`) + 1) FROM `student_id` WHERE `state` = :state AND `year` = :year DESC');
// Execute PDO SQL statement with values for :state & :year
$sth = $handle->execute(array(':state' => $st, ':year' => $yr));
$record_incremented = $sth->fetchAll();
}
}
return $record_incremented;
}
?>
这不是我最好的作品,但它应该能让你从一个解决方案开始有趣的帖子,你现在有什么数据库结构?我可以想出一些方法,但除非你发布你目前所拥有的东西,否则没有人会帮助我。我的想法是一样的。谢谢你的回复,但我认为这种方法存在问题。我的要求是,每个州以及每年都应该有自己的连续序列。您的算法很棒,但它将创建一个在所有州和年份之间共享的公共序列。但所需要的是,每个州每年都应该有自己独立的连续序列。在我看来,这就像是你自己的