基本上我想解释一下我想要实现的目标。
这是我的设置:
我在这里有一个列表页面: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字段添加到表中的过程是什么,我不完全确定是什么,因为那里没有很多教程?
答案 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;
该页面上倒数第二个子弹解释说这是TRUNCATE
和DELETE
之间的区别,因为后者不会必须重置自动增量:
表处理程序不记得上次使用的AUTO_INCREMENT 值,但从头开始计数[使用TRUNCATE,而不是DELETE ]。即使对于通常不重用序列值的MyISAM和InnoDB也是如此。
MySQL's Delete documentation详细说明DELETE
命令如何影响自动递增字段(取决于底层引擎):
如果删除包含最大值的行 在AUTO_INCREMENT列中,该值稍后会重复用于BDB表,但是 不适用于MyISAM或InnoDB表。如果删除表中的所有行 在自动提交模式下使用DELETE FROM tbl_name(没有WHERE子句), 除InnoDB和之外的所有存储引擎的序列重新开始 的MyISAM。