为MySQL行提供唯一ID';s


Giving MySQL rows unique ID's

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

这是我的设置:

我在这里有一个列表页面: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字段的过程是什么?由于没有太多教程,我不完全确定它是什么?

要向表中添加自动递增列,请执行以下操作-

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

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

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

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

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

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

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

Jay Blanchard建议的代码将自动递增字段添加到现有表中。MySQL Truncate语法文档解释说,当您使用Truncate时,重置自动递增计数器:

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

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

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

MySQL的Delete文档详细介绍了DELETE命令如何影响自动递增字段(取决于底层引擎):

如果删除包含AUTO_INCREMENT列,该值稍后会被BDB表重用,但是不适用于MyISAM或InnoDB表。如果删除表中的所有行在DELETE FROM tbl_ name(没有WHERE子句)处于自动提交模式的情况下,除了InnoDB和MyISAM。