【问题标题】:Giving MySQL rows unique ID's为 MySQL 行提供唯一 ID
【发布时间】:2014-10-07 17:31:32
【问题描述】:

所以基本上我想解释一下我想要实现的目标。

这是我的设置:

我在这里有一个列表页面:http://www.drivencarsales.co.uk/used-cars.php

所以你可以看到页面上的所有车辆都是使用以下 PHP 从我的 SQL 表中列出的:

<?php while($row = $results->fetch(PDO::FETCH_ASSOC))
      {
      echo '
      <div class="makes ' . $row["Make"] . '">
        <div class="listing-container">
          <a href="carpage.php"><h3 class="model-listing-title clearfix">'.$row["Make"].' '.$row["Model"].' '.$row["Variant"].'</h3></a>
          <h3 class="price-listing">£'.number_format($row['Price']).'</h3>
        </div>
        <div class="listing-container-spec">
         <img data-original="'.(explode(',', $row["PictureRefs"])[0]).'" class="stock-img-finder lazy"/>
          <div class="ul-listing-container">
            <ul class="overwrite-btstrp-ul">
              <li class="diesel-svg list-svg">'.$row["FuelType"].'</li>
              <li class="saloon-svg list-svg">'.$row["Bodytype"].'</li>
              <li class="gear-svg list-svg">'.$row["Transmission"].'</li>
              <li class="color-svg list-svg">'.$row["Colour"].'</li>
            </ul>
          </div>
          <ul class="overwrite-btstrp-ul other-specs-ul h4-style">
            <li>Mileage: '.number_format($row["Mileage"]).'</li>
            <li>Engine size: '.$row["EngineSize"].'cc</li>
          </ul>
          <button href="#" class="btn h4-style checked-btn hover-listing-btn"><span class="glyphicon glyphicon-ok"></span> History checked 
          </button>
          <button href="#" class="btn h4-style more-details-btn hover-listing-btn tst-mre-btn"><span class="glyphicon glyphicon-list"></span> More details 
          </button>
          <button href="#" class="btn h4-style test-drive-btn hover-listing-btn tst-mre-btn"><span class="test-drive-glyph"></span> Test drive 
          </button>
          <h4 class="h4-style listing-photos-count"><span class="glyphicon glyphicon-camera"></span> 5 More photos</h4>
        </div>
        </div>
          ';
      } ?>

我的 SQL 表中的所有行都使用 WHILE 循环进行循环。

所以现在我想创建一个专门用于每个 SQL 行/车辆的页面,例如,用户可以单击列出的车辆之一,它会将用户带到一个页面,其中包含有关该特定车辆的更多详细信息车辆。

有人告诉我最好的方法是给每一行一个 AUTO_INCREMENT id 字段。

虽然我的表格每天都被一个 CSV 文件截断,所以我对整个过程有点困惑,所以所有数据都被擦除了。

这是否意味着如果我有一个 AUTO_INCREMENT id 字段,它也会擦除它?

向表中添加 AUTO_INCREMENT id 字段的过程是什么,我不完全确定是什么,因为那里的教程不多?

【问题讨论】:

标签: php mysql


【解决方案1】:

要将自动递增的列添加到表中,请执行此操作 -

ALTER TABLE `<table name>` ADD `<column name>` INT NOT NULL AUTO_INCREMENT PRIMARY KEY; 

您的自动增量列将被清除,但将从下一个可用数字开始。换句话说,如果最后一个 id 是 1099,则输入的下一条记录(无论表是否被截断)将是 1100。如果您使用 id 生成页面,如果该 id 不再需要提供某种重定向存在(对于可能已为特定车辆添加书签的客户)。

如果您截断每一天,并且前一天的车辆仍然存在,则无法保证该车辆具有相同的 ID,这可能会让您的客户感到困惑。你为什么要截断?你有这么多车辆需要这样做吗?或者也许您应该考虑添加一个“销售日期”列,并且只显示尚未售出的车辆。然后,您可以定期从系统中清除这些车辆。

【讨论】:

  • 谢谢,让我很容易理解。我有一个问题。我可以将我的任何列设置为 auto_increment 还是需要它自己的列?
  • 顺便说一句,我不能只使用车辆登记作为身份证吗?这将为我节省大量时间和精力。
  • 是的 - 车辆登记将是一个很好的方式。这样一来,您根本不需要自动递增的列,并且每辆车都有唯一的标识。
【解决方案2】:

删除表格的所有内容并每天用新的 csv 文件重新填充它不是一个好主意:它会导致同一行具有不同的 ID,因此您将无法为特定页面添加书签特定的汽车。

我要做的是找到一个独特的属性或属性组合,并将该组合设置为在数据库中是唯一的。

然后,您可以在添加每日 cvs 文件时使用例如 INSERT ... ON DUPLICATE KEY UPDATE,以确保现有行将得到更新,并且只会添加新行。

这样,现有行的 ID 将保持不变,因此您始终可以使用相同的 url 访问特定项目。

【讨论】:

    【解决方案3】:

    Jay Blanchard 的 suggested code 会将自动增量字段添加到您现有的表中。 MySQL Truncate syntax documentation 解释说,当您使用 truncate 时,它​​重置自动增量计数器:

    "(当使用快速截断时,它会重置任何 AUTO_INCREMENT 计数器 为零。从 MySQL 5.0.13 开始,AUTO_INCREMENT 计数器重置为 TRUNCATE TABLE 为零,无论是否有外键 约束。)”

    该页面上倒数第二个项目符号说明这是TRUNCATEDELETE 之间的一个区别,因为后者不一定重置自动增量:

    表处理程序不记得上次使用的 AUTO_INCREMENT 值,但从头开始计数 [使用 TRUNCATE,而不是 DELETE]。即使对于通常不重用序列值的 MyISAM 和 InnoDB 也是如此。

    MySQL's Delete documentation 详细说明了DELETE 命令如何影响自动递增字段(取决于底层引擎):

    如果删除包含最大值的行 AUTO_INCREMENT 列,该值稍后用于 BDB 表,但 不适用于 MyISAM 或 InnoDB 表。如果删除表中的所有行 在自动提交模式下使用 DELETE FROM tbl_name(没有 WHERE 子句), 除 InnoDB 和 MyISAM。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 2020-06-13
      • 2012-01-14
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多