如何将自动增量设置为非主键?

Posted

技术标签:

【中文标题】如何将自动增量设置为非主键?【英文标题】: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');

【问题讨论】:

【参考方案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 这不适用于 mysqlSQLSTATE[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)'); 
);

【讨论】:

请评论此代码如何解决问题。

以上是关于如何将自动增量设置为非主键?的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 4.1 Code First - 插入非主键时自动递增字段

在使用 UUID 字段作为主字段的 Django 模型中添加非主键自动字段或“序列”字段

如何自动增加非主键? - SQL 服务器

如何在领域android中设置主键自动增量

我想将初始值设置为也设置为自动增量选项的主键,例如它从 mysql 中的值 7899 开始? [复制]

SQL Server 将自动增量主键添加到现有表