【问题标题】:PHP Mysql increment a column during insertPHP Mysql 在插入期间增加一列
【发布时间】:2011-08-22 08:51:29
【问题描述】:

对不起,让我试着解释一下....recordID 自动递增并且是我的主键..... LISTINGID 指的是不同表中的ID。在此表中,需要为具有相同 LISTINGID 的每条记录增加 recordListingID。我的插入语句最多插入 10 条具有相同 LISTINGID 的记录,我需要 recordListingID 从 1 开始,依此类推。

大家好

我正在从 php 向 mysql 中插入记录,它可以是 1 条或多条记录,我需要其中一个列来递增,第一个条目为 1,这是我的插入代码

mysql_query("INSERT INTO car_listing_images (recordID, recordText, recordListingID,   LISTINGID) VALUES ('', '$fileName', '??', '$listingid')");

我放哪里了??是需要增加的 col。我怎样才能做到这一点?

提前致谢!

【问题讨论】:

  • 对该字段使用自动增量.....

标签: php mysql increment


【解决方案1】:

可以使用MySql内置的Auto_Increment函数

  AUTO_INCREMENT

http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

MySql 会将指定的字段增加 1(或您设置的任何间隔)

【讨论】:

  • 这不是答案,他想要一个非主键来增加
  • 这对我没有好处,因为我想要增加的 col 不包含唯一数据。我已经为 recordID 这样做了
  • 如果您不想要主键,请删除主键引用 - 那是我的错误。
  • 这有什么理由被否决吗?请分享,如果我不正确,请告诉我。
【解决方案2】:

您可以使用user-defined variables

【讨论】:

    【解决方案3】:

    前言:如果您需要 2 个可递增但不相互关联的字段,那么您可能做错了。最好不要使用recordListingID,而是使用recordID,因为它们可能是相同的数字。

    如果您的表正在运行InnoDB,您可以创建事务。然后你可以尝试这样的事情:

    <?php
    
    mysql_query('START TRANSACTION');
    
    $recordListingId = mysql_result(mysql_query("SELECT count(*)+1 as num FROM car_listing_images WHERE LISTINGID=$listingid"), 'num', 0);
    
    mysql_query("INSERT INTO car_listing_images (recordID, recordText, recordListingID,   LISTINGID) VALUES ('', '$fileName', '$recordListingId', '$listingid')");
    
    mysql_query('COMMIT');
    ?>
    

    如果您没有 innodb,请尝试使用 stored procedure

    【讨论】:

    • OK recordID 已经自动递增,对于每个 recordID,recordListingID 的值可以是 1 到 10。许多 recordID 可以在 recordListingID 中包含这些值
    • 好的,我在第一个sql查询中添加了"WHERE LISTINGID=$listingid"。这应该在您添加 10 个项目的循环中进行。每次添加具有相同LISTINGID 的项目时,它都会增加$recordListingId。这也将允许您稍后返回并添加具有相同 LISTINGID 的记录,而无需跟踪值。
    【解决方案4】:

    更改您的表结构以包含您的 recordListingID 列的 AUTO_INCREMENT 属性,然后从插入中省略该列以使其自动填充增量数字。

    即:mysql_query("INSERT INTO car_listing_images (recordID, recordText, LISTINGID) VALUES ('', '$fileName', '$listingid')");

    【讨论】:

      【解决方案5】:

      您可以将变量初始化为 1 并使用 post-increment operator:

      $value = 1;
      for(...){
          $sql = 'INSERT ...';
          $value++;
      }
      

      【讨论】:

        【解决方案6】:

        我不知道我是否真的理解你的问题。

        如果您想为每条记录增加一列,则应将其定义为AUTO_INCREMENT 列。这样,在您的INSERT 语句中,如果您将NULL 插入该列,它每次都会上升。

        您也可以使用fieldname+1,但始终首选AUTO_INCREMENT


        根据我的评论,您可以这样做:

        $row = mysql_fetch_assoc(mysql_query("SELECT MAX(recordListingID) AS `max` FROM car_listing_images"));
        $next_id = $row['max'] + 1;
        mysql_query("INSERT INTO car_listing_images (recordID, recordText, recordListingID,   LISTINGID) VALUES ('', '$fileName', '$next_id', '$listingid')");
        

        我仍然强烈建议不要这样做,使用AUTO_INCREMENT 字段是一个非常更好的实现。


        在您发表最后一条评论后,我会提出以下建议。您将无法直接在 MySQL 中执行此操作(除非您使用变量,但如果您也插入多个 RecordID,这可能会出错)。

        $next_id = 0;
        foreach ($insert as $insert_stmt) {
            $next_id++;
            mysql_query("INSERT INTO car_listing_images (recordID, recordText, recordListingID,   LISTINGID) VALUES ('', '$fileName', '$next_id', '$listingid')");
        }
        

        【讨论】:

        • $mylid = 0; mysql_query("INSERT INTO car_listing_images (recordID, recordText, recordListingID, LISTINGID) VALUES ('', '$fileName', '$mylid+1', '$listingid')");
        • 不,抱歉,您需要在查询中执行此操作,我不确定在简单的插入语句中是否真的可行。插入时你可以有一个内部计数器,或者选择 MAX,查看我更新的答案(给我一分钟)。
        • 对不起,让我试着解释一下....recordID 自动递增并且是我的主键..... LISTINGID 指的是不同表中的ID。在此表中,需要为具有相同 LISTINGID 的每条记录增加 recordListingID。我的插入语句最多插入 10 条具有相同 LISTINGID 的记录,我需要 recordListingID 从 1 开始,依此类推。
        • $next_id = 0; foreach ($insert as $insert_stmt) { $next_id++; $insert_stmt = "INSERT INTO car_listing_images (recordID, recordText, recordListingID, LISTINGID) VALUES ('', '$fileName', '$next_id', '$listingid')"; $insert = mysql_query($insert_stmt) 或死(mysql_error()); }
        • 这应该可以正常工作,你收到错误了吗?尽管您应该注意,如果 $insert 为空,它将无法工作。您应该改为使用具有特定计数的for 循环,或循环遍历数据数组(即,每当需要运行查询时)。
        【解决方案7】:

        我想我知道你曾经/正在努力完成什么。可能有更好的方法,但我所做的是“从表中选择 max(id)+1 作为 nextId”并将其存储在我在您称为“recordListingID”的辅助 id 字段中使用的变量中。

        这样您插入的第一行将具有相同的 id 和 recordListingID,但其他行将 auto_inc id,但 recordListingID 将与第一行相同。

        在我的情况下,一次只有一个用户执行此操作,因此不会出错,但在多用户情况下,您可能需要修改此设置以注意同时执行插入操作的人时间。比如可能标记最后一行,这样你的查询就知道它已经完成,所以你可以像“select max(id)+1 as nextId from table where lastRow =1”或类似的东西。

        【讨论】:

          猜你喜欢
          • 2011-02-03
          • 2017-04-12
          • 2016-08-20
          • 2016-10-16
          • 2016-01-25
          • 2016-04-01
          • 2017-04-26
          • 1970-01-01
          • 2012-04-21
          相关资源
          最近更新 更多