如何根据数据库中的另一个变量存储不同自增的ID
Posted
技术标签:
【中文标题】如何根据数据库中的另一个变量存储不同自增的ID【英文标题】:How to store IDs of different auto-increment based on another variable in DB 【发布时间】:2017-02-09 02:28:10 【问题描述】:我正在验证在数据库中存储格式 ID 的理想方式:
[type] - [year] - [auto-increment]
其中auto-increment
字段基于type
。
这里有一些例子:
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,它们根据先到者的不同而有所不同。
我想到的表结构是这样的:
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;
只存储前两个,在保存到数据库期间,我在my_table
中搜索所有enum
s 并获得最大值(CI 风格,仅限伪代码):
$this->db->select_max('order');
$this->db->where('type', $type);
$order = $this->db->get('my_table');
$data_to_save['order'] = $order + 1;
我对每次都做增量没有信心,有没有更好的方法来处理这个问题?
我应该为我的types
创建多个表吗?说:
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;
【问题讨论】:
你得到一个 $order 的结果集,你为什么要在一个对象的结果集中加 1? 这是干什么用的?您是否正在跟踪其他表上的操作? @ShoyebSheikh:不要介意这些值,它只是伪代码。请关注 SQL。 @DFriend:用于识别不同预定义“种类”的文档。我只是使用INSERT
... 保密。
【参考方案1】:
根据新信息,如果您希望每个客户都有一个类似于该客户自动增量的计数器,有多种方法可以做到这一点,但它不是数据库中的自动增量。
首先查询该客户的 count_all_results。 http://www.codeigniter.com/user_guide/database/query_builder.html#CI_DB_query_builder::count_all_results 这将返回 0、1、2 等。
给计数器加一个。
在单独的字段中插入具有此计数器值的新记录。
这同样适用于从单独的字段动态创建引用,而不是将引用重新存储在另一列中。但是,如果您真的想要,您可以在插入之前从年份和计数器值创建参考格式并存储它,但我不会这样做。
另一种方法是在客户表 order_count 或类似表中存储一个计数器。创建新订单时,您可以增加 order_count 并将该值用于新订单记录。这样做的缺点是容易不同步,从而给出错误的计数值,导致重复的订单值,但具有显示总订单数、按总订单数排序客户等的优点。我个人不会这样做,但根据订单表中的订单即时生成此类信息。
希望对你有帮助,
【讨论】:
PS 如果删除订单,请执行软删除。即保留订单以供记录,但有另一列表明订单已被删除。 谢谢,我已经实现了versions。【参考方案2】:这在方法中似乎没有什么意义。
在您的数据库中,您可以像往常一样插入您的记录。然后使用
$id = $this->db->insert_id();
根据需要获取新插入数据的id。
如果您想设置订单,请使用自动设置的创建日期。如果要为商品生成代码,为什么要对订单和年份进行编码?如果年份是它创建的年份,这应该是一个时间戳字段,这样您就可以在 1 月或第 4 周获得创建的项目。如果订单是固定的,您只需要按日期排序。如果顺序是可以更改的排序顺序,它应该是一个独立的列,因此可以直接引用并在需要时进行编辑。
如果这没有帮助,那是因为您不完全清楚您要达到的目标。编码的 id-year-order 类型引用是您分别从所有三个字段生成的内容,如果查找,您将解码该引用以获取查找项目所需的字段。实际上,在这种情况下,您只需要 id 即可识别所引用的记录。
【讨论】:
订单和年份是业务逻辑,枚举-年份-订单是客户的。我只想知道如何理想地控制基于枚举的顺序。 您使用 ID,这就是它的用途。客户请求 16-2016-3,您知道 16 是 id,2016 是年份,3 是订单,所以要删除记录,比如说,您删除 id 16。要在输出上创建引用,您只需从三个单独的字段。否则,您将编码单独的信息并将相同的信息存储两次。 不,我无意存储 16-2016-3。老实说,我只是想知道如何确保 ID 中的所有第一个元素始终具有自己的自己的自动增量。 对不起,再次混淆。您存储记录的表有一个列 id,它是自动递增的,因此始终是唯一的。请参阅我现在正在写的第二个答案 - 给我一分钟。以上是关于如何根据数据库中的另一个变量存储不同自增的ID的主要内容,如果未能解决你的问题,请参考以下文章
mysql一个表id不是自增的,而且已经有数据了,现在想将id设为自增的sql语句:
如何在不删除sql server表中数据的情况下,让自增的id列从1开始