如何防止MariaDB中导入的表中的重复ID?

Gag*_*ous 7 database codeigniter duplicates auto-increment mariadb

(在那之前,我为我糟糕的英语道歉)我有这样的研究案例:

我目前在使用Web应用程序时出现问题.我为某个公司制作了一个Web应用程序.我使用CodeIgniter 3制作了应用程序.

我使用Maria DB构建了数据库.对于每个表中的id,我使用每个表的应用程序数据库的自动增量ID.我通常将Web应用程序部署到云服务器(有时公司有自己的专用服务器,但有时却没有).有一天,有一家公司,他们不想将我之前制作的应用程序部署到云端(出于安全目的,他们说).

该公司希望将该应用程序部署到员工的个人电脑上,而每个员工的电脑不相互连接(即独立的个人电脑/个人电脑/员工的笔记本电脑).他们说,他们会每5个月将员工个人电脑的所有数据收集到公司的数据中心,当然数据中心也没有连接到互联网.我告诉他们这不是存储数据的好方法.(因为当我尝试将所有数据合并为一个数据时,数据将重复,因为我的每个表的列ID都是自动增量ID,并且它是主键).不幸的是,该公司仍然希望以这种方式保留应用程序,我不知道如何解决这个问题.

他们至少有10名员工会使用这个网络应用程序.据此,我必须亲自将应用程序部署到10台PC上.

附加信息:每个员工都有自己从公司获得的唯一ID,我为每个员工创建了auto_increment id,如下表所示:

id   |  employee_id  | employee_name   |
1    | 156901010     |  emp1
2    | 156901039     |  emp2
3    | 156901019     |  emp3
4    | 156901015     |  emp4
5    | 156901009     |  emp5
6    | 156901038     |  emp6
Run Code Online (Sandbox Code Playgroud)

问题是每当他们从该应用程序填充表单时,某些表不存储员工的id,而是存储来自增量id的新id.

例如electronic_parts表格.它们具有如下属性:

| id  |  electronic_part_name  |  kind_of_electronic_part_id  |
Run Code Online (Sandbox Code Playgroud)

如果emp1从Web应用程序填写表单,表格的内容将在下面.

| id  |  electronic_part_name  |  kind_of_electronic_part_id  |
|  1  |   switch               |           1               |
Run Code Online (Sandbox Code Playgroud)

如果emp2填写来自网络应用程序的表单,表格的内容将在下面.

| id  |  electronic_part_name  |  kind_of_electronic_part_id  |
|  1  |      duct tape         |           10              |
Run Code Online (Sandbox Code Playgroud)

当我试图将表的内容合并到数据中心时,它会因为重复的ID而分崩离析.

当我在其他表中考虑我的外键时,情况变得越来越糟......例如customer_order表格.

customer_order列的表格如下所示(只是一个示例,不是实际的表,但类似).

|id  |  customer_name   |  electronic_parts_id  |  cashier(a.k.a employee_id, the increment id one, not the id that employee got from a company as i described above )  |
| 1  |   Henry          |           1           |              10              |
| 2  |   Julie          |           2           |              9               |
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决这个问题?或者有人可以建议/推荐我一些解决这个问题的好方法吗?

注意:每个员工都有自己的应用程序数据库,因此数据库不是集中式的,它是一个独立的数据库,这意味着,我必须逐个将数据库安装到员工的PC上

Dee*_*ath 9

这是一个非传统的情况,你可以有一个非常规的解决方案.

我可以建议你解决这个问题的两种方法.

  1. 而不是使用自动增量主键生成UUID并将其用作主键.关于随机UUID中重复的概率:仅在未来100年内每秒产生10亿UUID之后

    在CodeIgniter中,您可以使用以下代码片段执行此操作.

    $this->db->set('id', 'UUID', FALSE);
    
    Run Code Online (Sandbox Code Playgroud)

    这将生成一个36个字符的十六进制密钥(包括4个破折号).

    ac689561-f7c9-4f7e-be94-33c6c0fb0672
    
    Run Code Online (Sandbox Code Playgroud)

    正如您所看到的,它在字符串中有破折号,使用CodeIgniter DB函数会将其插入带有破折号的数据库中,它仍然有效.如果它看起来不干净,你可以删除并将字符串转换为32-char键.

    您可以在[CodeIgniter UUID库] [1]的帮助下使用以下功能.

    function uuid_key {
            $this->load->library('uuid');
            //Output a v4 UUID 
            $id = $this->uuid->v4();
            $id = str_replace('-', '', $id);
            $this->db->set('id', $id, FALSE);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    现在我们有一个32字节的密钥,

    ac689561f7c94f7ebe9433c6c0fb0672
    
    Run Code Online (Sandbox Code Playgroud)
  2. 解决此问题的另一种非常规方法是添加函数以将站点中处理的所有插入,更新,删除查询本地记录到文件中.通过这种方式,在每个本地实现中将生成一个日志文件,其中包含一个实际的查询列表,这些查询会按照正确的顺序顺序修改DB.

    在任何时间点,数据库的状态都是过去发生的所有查询集合的结果,直到该日期为止.

    因此,当您准备从员工个人计算机收集数据时,每5个月,而不是采取数据转储,请将此文件与所有查询日志一起使用.(注意:这样的查询日志不会有自动增量ID,因为它将是仅在向数据库执行时实时创建.)

    使用此类文件将数据导入数据中心.这不会发生冲突,因为它会实时生成数据中心的自动增量.(希望您以后任何时候都不必将本地链接到数据中心)

    [1]:https://github.com/Repox/codeigniter-uuid