如何将自动增量设置为非主键?
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
这不适用于 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)');
);
【讨论】:
请评论此代码如何解决问题。以上是关于如何将自动增量设置为非主键?的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 4.1 Code First - 插入非主键时自动递增字段
在使用 UUID 字段作为主字段的 Django 模型中添加非主键自动字段或“序列”字段