【问题标题】:Multiple Auto-Incrementing Columns For LaravelLaravel 的多个自动递增列
【发布时间】:2019-12-08 10:29:56
【问题描述】:

我正在尝试为名为@9​​87654322@ 的表创建第二个名为order 的自动递增列。我正在创建这个自动递增列,因为我使用的是 jQuery 可排序的,并且您可以更改帖子的顺序。但不幸的是,我收到了这个错误。

1075 表定义不正确;只能有一个自动列,并且必须定义为一个键

我试过$table->increments('order')->unique();,但这就是给我错误的原因。我还尝试创建一个外键约束,其中order 列将引用同一个表中的“id”列。我还尝试让 order 参数可填充到我的模型中。

这是我的迁移。

帖子迁移

Schema::create('posts', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id');
    $table->string('title');
    $table->text('body');
    $table->timestamps();
});

第二次帖子迁移

Schema::table('posts', function (Blueprint $table) {
    $table->increments('order')->unique();
});

预期的结果是,当迁移迁移时,它会在posts 表中创建一个名为order 的新列。这个新列应该是自动递增的。如果您需要更多信息,请不要害怕询问。

提前感谢您的帮助。

【问题讨论】:

  • 您的用例是什么?我的意思是,让我们假设order 列也是“自动增量的”。所以,现在你的idorder 列在每条记录上都在增加。你为什么需要这个?顺序将保持与idorder 相同的排序,不是吗?您希望以哪种方式更改帖子的排序方式?
  • 订单栏会按照它说的做,改变帖子的顺序。而 ID 将是主键。假设我发了两个帖子。帖子一:ID:1,订单:1。帖子二:ID:2,订单:2。
  • 好的...(?)。所以,如果orderid 具有相同的值.. 为什么不使用id 列进行排序?这将为您提供完全相同的结果。无需复制数据(两个相等的列)。另一种选择是在模型中创建一个等于 id 值的访问器,而无需将值存储在数据库中。
  • 现在我将为每个帖子制作 cmets,但我仍然使用帖子 ID 作为主键。基本上,如果我将一个帖子的 ID 与另一个帖子交换,就会出现问题,因为现在你有一个帖子的 cmets 现在转移到另一个帖子,如果这有意义的话。但是如果我只更改订单号,则不会相互交换任何数据,我们只是更改了一个数字。
  • 我刚看了你的评论,我会试试的

标签: php laravel laravel-5 laravel-migrations


【解决方案1】:

您只能将一列标记为身份。但是,如果两个标识列之间存在数学关系,则可以使用计算列。例如:

create table tbl (id1 int identity(1,100), id2 as id1 + 0)

【讨论】:

    【解决方案2】:

    两个自动递增的列?那就是疯狂。

    将您的order 列设置为默认数字,例如:0,并且只有在您想将某些东西的顺序设置为自定义时才修改它。使用 order 作为主排序键,idtimestamp 作为次要排序键。

    http://sqlfiddle.com/#!9/d55a51/2

    CREATE TABLE posts(
        `id` INTEGER AUTO_INCREMENT PRIMARY KEY,
        `order` INTEGER DEFAULT 0,
        `timestamp` DATETIME DEFAULT NOW()
    );
    
    INSERT INTO posts ( `order`, `timestamp` ) VALUES
      ( 0,  "2019-01-01 00:00:01" ),
      ( 0,  "2019-01-01 00:00:02" ),
      ( 1,  "2019-01-01 00:00:03" ),
      ( -1, "2019-01-01 00:00:04" ),
      ( 0,  "2019-01-01 00:00:05" );
    
    SELECT * FROM posts ORDER BY `order`, `id`;
    

    输出

    id  order   timestamp
    4   -1  2019-01-01T00:00:04Z
    1   0   2019-01-01T00:00:01Z
    2   0   2019-01-01T00:00:02Z
    5   0   2019-01-01T00:00:05Z
    3   1   2019-01-01T00:00:03Z
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 2016-03-07
      • 2011-03-18
      • 2012-04-10
      • 2014-04-15
      • 2011-11-13
      相关资源
      最近更新 更多