【问题标题】:How to set auto increment into non primary key?如何将自动增量设置为非主键?
【发布时间】:2017-08-13 06:37:45
【问题描述】:

如何在创建方法上设置不是主键的数据库自增字段?

唯一的方法是使用原始查询?

DB::statement('ALTER TABLE table CHANGE field field INT(10)AUTO_INCREMENT');

【问题讨论】:

    标签: laravel laravel-migrations laravel-schema-builder


    【解决方案1】:

    没有实现这样做。但是,我在Laravel Forums 找到了这个:

    Schema::table('table', function(Blueprint $t) {
        // Add the Auto-Increment column
        $t->increments("some_column");
    
        // Remove the primary key
        $t->dropPrimary("table_some_column_primary");
    
        // Set the actual primary key
        $t->primary(array("id"));
    });
    

    这未经测试,但应该可以工作。我不确定 Laravel 是如何调用它们的主键的,也许你必须先检查一下并调整 dropPrimary() 行以使其工作。

    【讨论】:

    • 嗨。我能够在不传递index_name 的情况下删除主键。 $t->dropPrimary()。 Laravel 自动检测特定列的主键索引的名称。我正在使用 Laravel 5.5 和 PostgreSQL
    • 这不适用于 MySQL: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
    • 我能够让它工作,但它需要在 3 个不同的部分:
       Schema::create('table', function(Blueprint $t) { // 添加自动增量列 $t->increments("some_column"); // 加上除实际 PK 之外的所有其他字段 }); Schema::table('table', function(Blueprint $t) { // 移除主键 $t->dropPrimary("table_some_column_primary"); }); Schema::table('table', function(Blueprint $t) { // 设置实际的主键 $t->primary(array("id")); }); 
    • 这对我有用(为自动增量列设置索引很重要)$table->uuid("id");$table->increments("aux_id");//其他列定义...//自动增量需要是一个索引(不一定primary) $table->index(array("aux_id")); //设置“正常”索引后,删除primary $table->dropPrimary(); //将primary添加到你想要的字段$table->primary("id");
    【解决方案2】:

    当前答案不起作用,自增列必须是主键。我建议在插入时使用firstOrCreate 以获得相同级别的唯一性(前提是您仍然需要一个可用的自动递增键)。

    【讨论】:

      【解决方案3】:

      在迁移时做一些变通方法我觉得不安全,所以我在模型文件中做了这个:

      /**
       *  Setup model event hooks
       */
      public static function boot()
      {
          parent::boot();
          self::creating(function ($model) {
              $model->field_here = $model->max('field_here') + 1;
          });
      }
      

      如果您想禁用自动增量,请在模型文件的开头添加:

      public $incrementing = FALSE;
      

      【讨论】:

      • 这在处理并发场景时可能会导致不好的事情。
      • 只是不删除记录? $model->dataset = Model::max('dataset') + 1; 怎么样
      • @Luiz 自动增量,可能对任何并发场景都不利。
      • @insign 谢谢,但这不是主题
      • 如果你删除一行,你会得到重复的值
      【解决方案4】:
      Schema::table('table_name', function(Blueprint $table) {
          DB::statement('ALTER TABLE table_name ADD column_name INT NOT NULL AUTO_INCREMENT AFTER after_column_name,  ADD INDEX (column_name)'); 
      });
      

      【讨论】:

      • 请评论此代码如何解决问题。
      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      相关资源
      最近更新 更多