Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何基于模式创建唯一ID_Php_Mysql_Unique Id - Fatal编程技术网

Php 如何基于模式创建唯一ID

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州录取的第一名学生

我正在进行一个学生数据库项目,在这个项目中,我必须根据模式生成一个唯一的13位ID(在数据库中,而不是通用的唯一ID)

模式 模式如下:前四位是州代码,后两位是学生入学年份,其余7位是简单的顺序代码,如0103115000001

问题 我不能使用mysql的自动递增功能,因为序列号必须独立于州代码和注册年份

为了说明清楚,考虑到我只有三个状态代码表示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;
}
?>


这不是我最好的作品,但它应该能让你从一个解决方案开始

有趣的帖子,你现在有什么数据库结构?我可以想出一些方法,但除非你发布你目前所拥有的东西,否则没有人会帮助我。我的想法是一样的。谢谢你的回复,但我认为这种方法存在问题。我的要求是,每个州以及每年都应该有自己的连续序列。您的算法很棒,但它将创建一个在所有州和年份之间共享的公共序列。但所需要的是,每个州每年都应该有自己独立的连续序列。在我看来,这就像是你自己的