laravel 迁移在不是主要的时候使用自动增量

Posted

技术标签:

【中文标题】laravel 迁移在不是主要的时候使用自动增量【英文标题】:laravel migration use auto increment when its not primary 【发布时间】:2017-10-14 19:57:37 【问题描述】:

我正在尝试使用 Laravel 迁移创建一个表,但我遇到了一些麻烦。我只需要创建一个带有主对('user_id' 和'media_id')的表,'inc' 是一个自动增量。我可以在 mysql 中做到这一点,但我无法用 Laravel 迁移做到这一点,因为 increments() 也将该字段设置为主要字段。我得到的错误

 SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table definition; there can be only one auto column and it must be defined as a key

到目前为止,我已经做到了

 public function up()
    
        Schema::create('tagtables', function (Blueprint $table) 
            
            $table->integer('media_id');
            $table->integer('user_id');
            $table->boolean('approved')->default(false);
            $table->increments('inc')->unsigned();
            $table->timestamps();
            $table->dropPrimary('tagtables_inc_primary');
            $table->primary(array('user_id','media_id'));
                        
            // $table->foreign('media_id')->references('id')->on('media')->onUpdate('cascade')->onDelete('cascade');
            // $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
        );


        // Schema::table('tagtables', function (Blueprint $table) 
        //     //$table->increments('id');
        //     $table->primary(array('user_id','media_id'));
        //     $table->foreign('media_id')->references('id')->on('media')->onUpdate('cascade')->onDelete('cascade');
        //     $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
            
        // );
    

【问题讨论】:

你不需要将它们设为主键,而它们是外键 【参考方案1】:

我认为你需要这个:

public function up()

    Schema::create('tagtables', function (Blueprint $table) 
        $table->increments('inc');
        $table->integer('media_id')->unsigned();
        $table->integer('user_id')->unsigned();
        $table->boolean('approved')->default(false);
        $table->timestamps();

        $table->index(['user_id', 'media_id']);
        $table->foreign('media_id')->references('id')->on('media')->onUpdate('cascade')->onDelete('cascade');
        $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
    );

并将其放入模型中:

protected $primaryKey = 'inc';

【讨论】:

我收到另一个错误 [Illuminate\Database\QueryException] SQLSTATE[42000]:语法错误或访问冲突:1068 定义了多个主键(SQL:alter table tagtables add primary key tagtables_user_id_media_id_primary( user_id, media_id)) 对不起,我只是从您的帖子中复制其余代码。将$table->primary(['user_id', 'media_id']); 更改为$table->index(['user_id', 'media_id']);【参考方案2】:

我找到了问题的解决方案,即在创建架构后定义该列 inc(自动递增)。

应该是这样的

public function up()
    
        Schema::create('tagtables', function (Blueprint $table) 
            
            $table->integer('media_id');
            $table->integer('user_id');
            $table->boolean('approved')->default(false);
           // $table->increments('inc');
            $table->timestamps();
          //  $table->dropPrimary( 'tagtables_inc_primary' );
            $table->primary(array('user_id','media_id'));
                        
            // $table->foreign('media_id')->references('id')->on('media')->onUpdate('cascade')->onDelete('cascade');
            // $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
        );

    DB::statement('ALTER Table tagtables add id INTEGER NOT NULL UNIQUE AUTO_INCREMENT;');
        // Schema::table('tagtables', function (Blueprint $table) 
        //     //$table->increments('id');
        //     $table->primary(array('user_id','media_id'));
        //     $table->foreign('media_id')->references('id')->on('media')->onUpdate('cascade')->onDelete('cascade');
        //     $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
            
        // );
    

化学

【讨论】:

以上是关于laravel 迁移在不是主要的时候使用自动增量的主要内容,如果未能解决你的问题,请参考以下文章

Doctorine/Dbal - 更新表迁移在整数上添加不需要的“自动增量”(不是增量)

在迁移 laravel 5.1 中设置自动增量字段从 1000 开始

Laravel 迁移 - 如何将 `id` 字段更改为主要字段并稍后自动递增

Laravel 5:在服务器环境而不是本地运行迁移

用于Java开发人员的Oracle数据库中的自动增量

当与模型链接的表为非自动增量时,Laravel 模型获取下一个增量 ID