如何在拉拉维尔用户删除中重置自动增量?

2022-08-30 20:26:29

我一直在努力寻找一种方法来重置Laravel 4中的自动增量值,但似乎至少目前还没有嵌入到laravel 4中。所以我这样做:

$user = User::find($user_id);

                if ($user)  {
                    if ($user->delete()){

                    DB::statement('ALTER TABLE users AUTO_INCREMENT = '.(count(User::all())+1).';');

                    echo json_encode('User Was Deleted Successfully..');
                    }   
            }

每次我从数据库中删除用户时,我都会将自动递增指针设置为所有用户的数量+1。

如果有人有更好的解决方案,请告诉我..


答案 1

像其他人一样,当你删除一行时,真的没有必要把计数器移回来。但是,您可以创建一个表,它将删除所有表行并重置计数器。truncate

不能对它应用表 (与仅删除所有行,同时保留自动递增计数器的表不同。truncateForeign Key Constraintstruncatedelete

因此,在使用 时,MySQL可能会阻止您截断已应用于它的表。foreign key constrainsforeign key constraints

您可以执行以下步骤来实现所需的目标,但请注意,数据完整性可能存在风险。我只将其用于测试目的

  1. 按如下方式编辑类(可在 中查看):DatabaseSeederapp/database/seeds/DatabaseSeeder.php

    <?php
    class DatabaseSeeder extends Seeder {
        /**
        * Run the database seeds.
        *
        * @return void
        */
        public function run()
        {
            Eloquent::unguard();
    
            // Disable Foreign key check for this connection before running seeders
            DB::statement('SET FOREIGN_KEY_CHECKS=0;');
    
            $this->call('UserTableSeeder');
            // ...
    
            // FOREIGN_KEY_CHECKS is supposed to only apply to a single
            // connection and reset itself but I like to explicitly
            // undo what I've done for clarity
            DB::statement('SET FOREIGN_KEY_CHECKS=1;');
        }
    }
    
  2. 现在,Table Seeder 类(在本例中,应在 中创建)可以按如下方式调用 truncate 表:UserTableSeederapp/database/seeds/UserTableSeeder.php

    <?php
    class UserTableSeeder extends Seeder {
    
        public function run()
        {
            // Truncate the table.
            DB::table('users')->truncate();
    
    
            // The auto-increment has been reset.
            // Now we can start adding users.
            User::create(
                array(
                    'email' => 'example@domain.com',
                    'password' => Hash::make('test')
                )
            );
        }
    }
    

答案 2
use Illuminate\Support\Facades\DB;

public function refreshDB()
{
    $max = DB::table('users')->max('id') + 1; 
    DB::statement("ALTER TABLE users AUTO_INCREMENT =  $max");
}

// Note: This solution is for resetting the auto_increment of the table without truncating the table itself 

推荐