当前位置: 首页 > 知识库问答 >
问题:

Laravel 4:如何使用迁移创建非主自动递增列?

陈修诚
2023-03-14

我目前正在从事一个由主服务器和许多客户端组成的Laravel4项目。客户端创建数据并将其发送到主服务器。为了避免冲突,我使用UUIDV4作为主键。

但是,一旦在服务器上创建了数据,我希望分配一个唯一的自动递增整数,以便用户更容易识别数据。例如:用户不必谈论项目5a8e896d-3ab4-48d2-9d39-faeb5227f012而可以谈论项目24567

为了保持应用程序的可管理性,我正在使用迁移,此表的当前迁移如下所示:

public function up()
{
    Schema::table('items', function($table)
    {
        $table->create();
        $table->string('id')->primary(); //'id' For the purpose of keeping the ORM working, this field stores the UUID.
        $table->integer('number', true); //The human readable item number, the second parameter is true for auto-increment
        $table->text('otherdata');
        $table->timestamps();
    });
}

问题是,Laravel在定义自动增量时自动创建主键,因此迁移最终失败,因为有两个主键。

[Exception] SQLSTATE[42000]: Syntax error or access violation: 1068 Multiple primary key defined
  (SQL: alter table `items` add primary key items_id_primary(`id`)) (Bindings: array ())

是否有任何方法可以使用Laravel 4迁移使表具有主键和单独的自动递增字段。

共有3个答案

缪成天
2023-03-14

我认为如果不修改核心文件,这是不可能的,因为创建自动增量会自动将其作为主键。

如果你能在Larvel框架开发团队中将其报告为bug,那就更好了。

在这里谢谢:)

郑光济
2023-03-14

诀窍是将其添加到Schema::create之外,如下所示

Schema::create('payments', function(Blueprint $table)
{
   $table->string('primaryKey', 30);
   $table->primary('primaryKey');
   //...
});
DB::statement('ALTER Table tableName add id INTEGER NOT NULL UNIQUE AUTO_INCREMENT;');

然后重做迁移,将在表tableName中创建一个名为id的键,然后您可以像访问任何其他键一样访问它。

景同
2023-03-14

我发现了问题,Laravel似乎在为每个自动增量字段创建主键。当我删除主键部分时,它要求我提供索引,因此我调用-

/**
 * Get the SQL for an auto-increment column modifier.
 *
 * @param  Illuminate\Database\Schema\Blueprint  $blueprint
 * @param  Illuminate\Support\Fluent  $column
 * @return string|null
 */
protected function modifyIncrement(Blueprint $blueprint, Fluent $column)
{
    if ($column->type == 'integer' and $column->autoIncrement)
    {
        return ' auto_increment unique'; //return ' auto_increment primary key';
    }
}

 类似资料:
  • 正如标题所描述的,我试图利用phinx进行数据库迁移,但我有一个自动增量列,它并没有用作主键。据我所知,菲尼克斯是做不到这一点的。 我意识到,我可能完全没有那个列,但它是巨大的遗留代码的一部分,至少目前,我没有时间重构整个应用程序,以确保该列不会在任何地方使用。如果我的结论是正确的,而phinx无法实现这一点,我希望有一些替代方案,拥有所描述的功能

  • 问题内容: 我使用的是与开源Parse Server集成在一起的PostgreSQL 9.5 X64。我的表具有以下结构。 由于使用了Parse Server,因此是主键。它由Parse Server自动生成。该不是主键。我想在创建新记录时自动增加1。如何在创建表中实现? 问题答案: 您可以尝试制作专栏文章。我不知道是否可以更改当前列以使其为串行,因此我们可能必须删除该列,然后将其添加回去,如下所

  • 我已经使用Phinx迁移创建了一个表 现在在一个单独的迁移中,我想改变表,并将id值设置为true,并将该id作为主键(默认行为)。并将validation_id作为唯一索引。 我知道如何先删除表并创建新表。但是我不想放下桌子,只是改变它。如何改变表添加回自动增量默认id列?

  • 这看起来很奇怪,因为可以自动生成这些迁移(例如,像django一样),而且令人惊讶的是,V1的create-commands是自动生成的,但是如果我以后添加一个表,我必须手动键入命令。 那么,我是错过了它,还是我真的必须编写迁移?

  • 问题内容: 我有这样的桌子 我想增加我的id字段,例如…等。我该怎么做?请让我知道任何可能的方式。 问题答案: 如果您确实需要此功能,则可以借助单独的表进行排序(如果您不介意的话)和触发器来实现您的目标。 桌子 现在触发 然后您只需将行插入到table1 然后你会 这是 SQLFiddle 演示

  • 问题内容: 我需要创建一个包含增量ID的表,但是我希望这些ID根据另一列自动进行细分。这是我想要的: 我想要显示类似以下内容: 意思是我希望每个类别自动递增,并为插入的任何新类别从1重新开始。我希望在表中的任何插入处自己完成此操作(我不想在插入此表时记得这样做)。 我认为这可以通过窗口函数或触发器来完成,但我不知道如何做到。 编辑: 我希望数据能够持久保存,以避免在发生数据删除时对增量ID进行移位