【问题标题】:Mysql Auto Increment For Group Entries组条目的Mysql自动增量
【发布时间】:2014-07-25 12:42:33
【问题描述】:

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

【问题讨论】:

    标签: mysql auto-increment


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

    【讨论】:

    • 这将是要走的路。我正在转换一个 15 年前编写的项目,并且没有来自原始编码器的所有信息。我想以上面建议的方式处理任务,只是不知道是否有替代方法,因为原始编码器似乎更喜欢另一种方法。
    • 注意比赛条件。
    【解决方案2】:

    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) 防止表变大并浪费空间。我们不关心表中的任何行,除了最近的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2014-05-06
      相关资源
      最近更新 更多