组条目的Mysql自动增量

时间:2014-06-04 18:13:42

标签: mysql auto-increment

我需要设置一个有两个自动增量字段的表。 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程序中将其递增一个吗?只是寻找最佳解决方案。

2 个答案:

答案 0 :(得分:2)

你应该有两个单独的表。

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添加到所有插入的记录中。我不建议这样做。你会遇到麻烦。

答案 1 :(得分:1)

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)使得表格不会变大并浪费空间。除最近的一行外,我们不关心表格中的任何行。