为MySQL行提供唯一的ID

时间:2014-10-07 17:31:33

标签: php mysql

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

这是我的设置:

我在这里有一个列表页面: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字段添加到表中的过程是什么,我不完全确定是什么,因为那里没有很多教程?

3 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

  

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

该页面上倒数第二个子弹解释说这是TRUNCATEDELETE之间的区别,因为后者不会必须重置自动增量:

  

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

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

  

如果删除包含最大值的行   在AUTO_INCREMENT列中,该值稍后会重复用于BDB表,但是   不适用于MyISAM或InnoDB表。如果删除表中的所有行   在自动提交模式下使用DELETE FROM tbl_name(没有WHERE子句),   除InnoDB和之外的所有存储引擎的序列重新开始   的MyISAM。