繁体   English   中英

组条目的Mysql自动增量

[英]Mysql Auto Increment For Group Entries

我需要设置一个具有两个自动增量字段的表。 每个添加的记录的标准主键为1个字段。 另一个字段将用于将多个记录链接在一起。

这是一个例子。

field 1  |  field 2
  1           1
  2           1
  3           1
  4           2
  5           2
  6           3

请注意,字段1中的每个值都有自动增量。 字段2的自动增量略有不同。 记录1,2和3同时进行。 记录4和5同时进行。 记录6是单独制作的。

最好阅读字段2的最后一个条目,然后在我的php程序中将其递增1? 只是寻找最佳解决方案。

您应该有两个单独的表。

ItemsToBeInserted
id, batch_id, field, field, field

BatchesOfInserts
id, created_time, field, field field

然后,您将创建一个批次记录,并将该批次的插入ID添加到将成为该批次一部分的所有项目中。

如果将batch_hash字段添加到批处理表中,然后检查每个批处理是否唯一,那么您将获得加分,这样就不会意外地将同一批提交两次。

如果您正在寻找一种仅使用一张表的更糟糕的方法,则可以执行以下操作:

$batch = //Code to run and get 'SELECT MAX(BATCH_ID) + 1 AS NEW_BATCH_ID FROM myTable' 

并将该ID添加到所有插入的记录中。 我不建议这样做。 您会遇到麻烦。

MySQL每张表仅提供一个自动增量列。 您不能定义两个,这样做也没有意义。

您的问题不是说要使用什么逻辑来控制第二个字段的增量(称为自动增量)。 大概您的PHP程序将驱动该逻辑。

不要使用PHP查询最大的ID号,然后递增并使用它。 如果这样做,您的系统很容易受到竞争条件的影响。 也就是说,如果您的PHP程序的多个实例同时尝试该操作,它们有时会错误地得到相同的数字。

Oracle DBMS有一个称为sequence的对象,该对象会返回保证唯一的数字。 但是您正在使用MySQL。 您可以使用如下所示的编程模式获取唯一编号。

首先为序列创建一个表。 它具有一个自动递增字段,仅此而已。

CREATE TABLE sequence (
    sequence_id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`sequence_id`)
)

然后,当您在程序中需要唯一编号时,一个接一个地发出以下三个查询:

INSERT INTO sequence () VALUES ();
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SELECT LAST_INSERT_ID() AS sequence;

确保第三个查询返回唯一的序列号。 即使您有数十个不同的客户端程序连接到数据库,该保证仍然有效。 这就是AUTO_INCREMENT的优点。

第二个查询( DELETE )防止表变大和浪费空间。 除了最近的那一行,我们不在乎表中的任何行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM