【问题标题】:Best way to INSERT autoincrement field? (PHP/MySQL)插入自动增量字段的最佳方法? (PHP/MySQL)
【发布时间】:2010-12-02 01:15:41
【问题描述】:

我必须将数据插入两个表,Items 和 Class_Items。 (第三个表,Classes 在这里是相关的,但没有被插入)。

Items的主键是Item_ID,是一个自增的整数。除了这个主键之外,Items 中没有唯一的字段。我需要知道 Item_ID 是什么以将其与 Class_Items 中的类匹配。

这一切都是通过 PHP 接口完成的。我想知道插入项目的最佳方法是什么,然后将它们的 Item_ID 匹配到 Class_Items 中。以下是我看到的两个主要选项:

  • 插入每个项目,然后使用 mysql_insert_id() 为 Class_Items INSERT 查询获取其 Item_ID。这意味着对每个项目进行一次查询(总共有数千个查询)。
  • 获取下一个自动增量 ID,然后锁定 Class_Items 表,以便我可以继续添加到 $item_id 变量。这意味着只有两个查询(一个用于 Items,一个用于 Class_Items)

哪种方式最好,为什么?此外,如果您有未列出的替代方案,我愿意接受最有效的方法。

【问题讨论】:

  • 除非您经常添加数千个项目,否则您在第一个替代方案中提到的“查询成本”不会成为常见问题;它只会在初始项目导入期间真正咬你。不过,这显然取决于您的具体问题。
  • 很公平。即使现在赌注不那么高,我仍然想知道哪个更好。未来我会做几十万
  • mysql_insert_id() 不是一个查询——它只是暴露了前一个查询中现有的一个值。微不足道的开销。
  • @le dorfier 它是 SELECT LAST_INSERT_ID() 查询的包装器

标签: php sql mysql auto-increment


【解决方案1】:

最有效的可能是使用参数化查询。这将需要使用 mysqli 函数,但如果您需要优化这种查询,您应该考虑在那里。

无论你如何切割它,你都有两个插件要做。执行第一个操作,如您所描述的那样获取新的 ID 值(这会带来微不足道的开销,因为该值已经存在于 mysql 中)并在第二个插入中使用它非常少。

【讨论】:

    【解决方案2】:

    我会使用存储过程和/或事务进行调查,以确保不会发生任何不好的事情。

    【讨论】:

    • 我肯定会使用事务
    【解决方案3】:

    我正在使用 mysql 进行一个项目,我所做的是以下(不使用自动增量字段):

    1- 我创建了一个名为 SEQUENCE 的表,其中一个名为 VALUE 的 BIGINT 类型的字段的初始值为 1。该表将存储每次插入新记录时都会递增的 id 值。

    2- 创建一个存储过程并在事务中处理其中的 id 增量。

    这是一个例子。

    CREATE PROCEDURE `SP_registerUser`(
    
    IN _username VARCHAR(40),
    IN _password VARCHAR(40),
    
    )
    BEGIN
    
    DECLARE seq_user BIGINT;
    
    START TRANSACTION;
    
    #Validate that user does not exist etc..........
    
    
          #Register the user
          SELECT value FROM SEQUENCE INTO seq_user;
          UPDATE SECUENCE SET value = value + 1;
    
          INSERT INTO users VALUES(seq_user, _username, SHA1(_password));
    
          INSERT INTO user_info VALUES(seq_user, UTC_TIMESTAMP());
    
    
    COMMIT;
    
    END //
    

    就我而言,我想将用户 ID 存储在两个不同的表中(用户和 user_info)

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      相关资源
      最近更新 更多