Php 如何在DB中存储基于另一个变量的不同自动增量的ID

Php 如何在DB中存储基于另一个变量的不同自动增量的ID,php,mysql,database,codeigniter,Php,Mysql,Database,Codeigniter,我要验证在数据库中存储格式ID的理想方法: [type] - [year] - [auto-increment] 其中,自动递增字段基于类型 以下是一些例子: ABC-2016-1 ABC-2016-2 XYZ-2016-1 ABC-2016-3 XYZ-2016-2 AAA-2016-1 AAA-2016-2 AAA-2016-3 正如我们所看到的,ABC、XYZ和AAA有不同的自动增量ID,它们根据最先出现的ID而有所不同 我对表格结构的看法是: TABLE my_table (

我要验证在数据库中存储格式ID的理想方法:

[type] - [year] - [auto-increment]
其中,
自动递增
字段基于
类型

以下是一些例子:

ABC-2016-1
ABC-2016-2
XYZ-2016-1
ABC-2016-3
XYZ-2016-2
AAA-2016-1
AAA-2016-2
AAA-2016-3
正如我们所看到的,
ABC
XYZ
AAA
不同的自动增量ID,它们根据最先出现的ID而有所不同

我对表格结构的看法是:

TABLE my_table (
    id INT UNSIGNED AUTO_INCREMENT UNIQUE PRIMARY KEY,
    type ENUM('ABC', 'XYZ', 'AAA') NOT NULL,
    year INT UNSIGNED NOT NULL,
    order INT UNSIGNED NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;
只需存储前两个,在保存到DB的过程中,我搜索
my_表
,查找所有
enum
s,并获得最大ie(CI样式,仅伪代码):

我没有信心每次都做增量,有没有更好的方法来处理这个问题

我应该为我的
类型创建多个表吗?说:

TABLE abc (
    id INT UNSIGNED AUTO_INCREMENT UNIQUE PRIMARY KEY,
    year INT UNSIGNED NOT NULL,
    order INT UNSIGNED NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;

TABLE xyz (
    id INT UNSIGNED AUTO_INCREMENT UNIQUE PRIMARY KEY,
    year INT UNSIGNED NOT NULL,
    order INT UNSIGNED NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;

TABLE aaa (
    id INT UNSIGNED AUTO_INCREMENT UNIQUE PRIMARY KEY,
    year INT UNSIGNED NOT NULL,
    order INT UNSIGNED NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;

这种方法似乎没有什么意义

在数据库中,您可以像平常一样插入记录。然后使用

$id = $this->db->insert_id();
如果需要,获取新插入数据的id

如果要设置订单,请使用自动设置创建日期。如果要为项目生成代码,为什么要对订单和年份进行编码?如果年份是它创建的年份,那么这应该是一个时间戳字段,这样您就可以在1月或第4周创建项目。如果订单是固定的,您只需要按日期排序。如果排序顺序是可以更改的排序顺序,则它本身应是一列,以便在需要时可以直接引用和编辑


如果这对你没有帮助,那是因为你还不完全清楚你想要实现什么。编码的id year order type引用是从所有三个字段分别生成的,如果查找,则对引用进行解码,以获得需要查找项目的字段。事实上,在这种情况下,您只需要id就可以识别所引用的记录。

根据新信息,如果您希望每个客户都有一个类似于该客户自动递增的计数器,有多种方法可以做到这一点,但它不是来自数据库的自动递增

  • 首先进行查询以统计该客户的所有结果。 这将返回0、1、2等

  • 在柜台上加一个

  • 在单独的字段中插入具有此计数器值的新记录

  • 这同样适用于从单独的字段动态创建引用,而不是将引用重新存储在另一列中。然而,如果您真的想这样做,您可以在插入之前,从年份和计数器值创建引用格式,并存储它,但我不会这样做

    另一种方法是在customer表、order_count或类似表中存储计数器。创建新订单时,可以增加订单数量,并将该值用于新订单记录。这样做的缺点是容易失去同步,从而给出错误的计数值,导致重复的订单值,但具有显示已下订单总数、按订单总数对客户进行排序等优点。我个人不会这样做,而是根据订单表中的订单动态生成此类信息


    希望这会有所帮助,

    您将以$order获得一个结果集,为什么要将1添加到一个对象的结果集?这是用于什么?你在跟踪其他表上的操作吗?@ShoyebSheikh:不要介意这些值,它只是伪代码。请关注SQL。@DFriend:它用于标识不同预定义“种类”的文档。我刚才用了
    INSERT
    。。。为了保密。订单和年份是业务逻辑,枚举年份订单是客户的。我只是想知道,理想情况下,如何基于枚举控制顺序。您使用ID,这就是它的用途。客户请求16-2016-3,您知道16是id,2016是年份,3是订单,所以要删除记录,比如说,您删除id 16。要在输出上创建引用,只需从三个单独的字段创建它。否则,您将对单独的信息进行编码,并将相同的信息存储两次。不,我无意存储16-2016-3。老实说,我只是想知道如何确保ID中的所有第一个元素都有自己的自动增量。对不起,再次困惑。存储记录的表有一个列id,它是自动递增的,因此总是唯一的。请看我正在写的第二个答案-给我一分钟。PS如果删除订单,请执行软删除。Ie为您的记录保留订单,但有另一列表明订单已被删除。谢谢,我已经实现了。
    $id = $this->db->insert_id();