Php 使用自动递增ID作为主键

Php 使用自动递增ID作为主键,php,mysql,laravel-5,Php,Mysql,Laravel 5,我正在写一个基本的博客。用户可以添加帖子,填写标题、正文、日期。提交时,主id字段将明显自动递增 我使用Laravel 5种子来填充数据库中的虚拟数据。问题是,当我需要重新设定数据种子时,我会删除前面的行,DB::table('articles')->delete()然后重新设定种子 问题是,自动递增的id从上一个id继续。所以,如果我在初始迁移时播种10行,我得到1到10行。没问题。如果我重新设定种子,我会得到id11-21 这是有问题的,因为我是通过ID访问文章的,http://localh

我正在写一个基本的博客。用户可以添加帖子,填写标题、正文、日期。提交时,主id字段将明显自动递增

我使用Laravel 5种子来填充数据库中的虚拟数据。问题是,当我需要重新设定数据种子时,我会删除前面的行,
DB::table('articles')->delete()然后重新设定种子

问题是,自动递增的
id
从上一个
id
继续。所以,如果我在初始迁移时播种10行,我得到1到10行。没问题。如果我重新设定种子,我会得到
id
11-21

这是有问题的,因为我是通过ID访问文章的,
http://localhost/article/1
Route::get('article/{id}'…
)但是显然不再有1的id。第一个article id现在是11

为了解决这个问题,我创建了第二个
id
列,名为
article\u id
$table->primary('article\u id')->unsigned();
,作为主键,这样Laravel就会查询它

  • 这会导致现在的问题,因为在插入文章时,我需要某种方法来自动增加ID
  • 拥有第二个
    id
    列似乎是不必要的,也是创建模式的糟糕方法

我确信这是一个常见的问题-我想知道如何解决这个问题。

在PHP中,当您想重置自动增量id时,而不仅仅是在PHP中执行select或insert或任何其他sql命令时执行此命令

   ALTER TABLE tablename AUTO_INCREMENT = 1

关于

尽管这些值是自动创建的,但MySQL确实允许您显式地为它们设置值。换句话说,如果您要迁移表,您不必担心键会以正确的顺序自动创建,并且有适当的间隔,您只需在insert中写入值即可

CREATE TABLE t_autoinc1
(
   c1 INT AUTO_INCREMENT PRIMARY KEY
 );

 -- 0 or NULL means that next ID will be generated by MySQL automatically

 -- inserts 1
 INSERT INTO t_autoinc1 VALUES (0)
 -- inserts 2
 INSERT INTO t_autoinc1 VALUES (NULL)

 -- inserts 100, not 3
 INSERT INTO t_autoinc1 VALUES (100)

 -- inserts 101
 INSERT INTO t_autoinc1 VALUES (NULL)
在MySQL论坛中可以看到这个答案

将删除
文章的全部内容
并重置其增量ID


出于明显的原因,请确保不能在生产中调用此功能。:-

一种方法是重置自动增量id:我不明白为什么会出现此问题。但是TRUNCATE会重置AI。@struncate
http://localhost/article/1
,如果数据库中没有
id
为1的文章,那么我会得到一个
ModelNotFound
异常。@Growler,你应该这样做。为什么这很重要?用户不会通过随机选取项目ID来导航您的站点。如果只是为了测试,
DB::table('articles')->truncate()
将清空它并重置ID。只需确保它不能在生产中调用即可。
DB::table('articles')->truncate();