无论如何分配一个等于id本身的表的默认值?

Posted

技术标签:

【中文标题】无论如何分配一个等于id本身的表的默认值?【英文标题】:Is there anyway to assign a default value of a table equal to the id itself? 【发布时间】:2021-10-06 02:36:55 【问题描述】:

所以我想将order 列的default value 设置为等于id。这几乎是为了排序。

还有办法吗?还是有更好的方法来达到同样的目的?

Schema::create('posts', function (Blueprint $table) 
    $table->id();
    $table->string('title');
    $table->bigInteger('order');
    $table->string('path');
    $table->text('description')->default('');

    $table->timestamps();
);

【问题讨论】:

所以对id进行排序,就可以完全删除order 但我想让更改顺序成为可能,这就是我想要一个单独字段的原因 您可以将订单字段设置为与id分开自动递增。你不需要它与“id”相同,你只需要它是有序的。 @N69S 我试过了,它给了我一个错误,说我只能有 1 个自动递增字段 【参考方案1】:

每次在帖子表中创建/保存新条目后,只需获取该行的 id 并再次保存:

$post->save();
$post->order = $post->id;
$post->save();

这并不理想,因为它需要为每个帖子创建额外的数据库操作,但实际上它可能永远不会成为问题,除非您的项目变得非常大。

【讨论】:

有点希望它自动化虽然大声笑,导致练习 laravel/vue 我理解更清楚地解决问题的冲动,但避免陷入这个小细节并腾出时间更快地完成更多实际项目也可能是有价值的。一切都是权衡,祝你好运 @huhehu 一直认为这类问题是:“如果是业务逻辑问题,php或JS之类的编程语言,或者框架必须解决,而不是DB... DB强制执行规则或数据,但不执行逻辑”,因此您必须使用 PHP 来解决这个问题...【参考方案2】:

不,你不能让它自动化。

即使在带有表达式默认值的 mysql 8.0 中。见https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html 上面写着:

表达式默认值不能依赖于具有 AUTO_INCREMENT 属性的列。

您不能编写触发器来执行此操作。您只能在 BEFORE INSERT 触发器中更改列值。但是当时尚未生成 id 列的自动增量值。自增值仅在AFTER INSERT 触发器中可用,但到那时,您无法修改行的列,因为它已经被插入。

做你想做的唯一方法是插入行,然后运行另一个 SQL UPDATE 将自动增量值从 id 列复制到 order 列。

【讨论】:

【参考方案3】:

你不能用 laravel 迁移做到这一点,mysql 不支持创建表。

您可以创建一个 mysql 触发器来设置插入字段 https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html

但真正的问题是,为什么您想要一个相同的字段只是为了排序?

【讨论】:

原因基本上是这样我可以改顺序 @huhehu 你可以先按“order”字段排序,再按“id”排序,这样如果你不设置自定义订单,就按id排序,例如:->orderBy('order', 'DESC')->orderBy('id', 'DESC') 【参考方案4】:

您可以通过以下方式进行操作。 created 事件一旦创建就会被调用,永远不会调用更新

class Post extends Model

    protected static function booted() 
        self::created(function (self $post)
            $post->order = $post->id;
            $post->save();
        );
    

Laravel Documentation

【讨论】:

以上是关于无论如何分配一个等于id本身的表的默认值?的主要内容,如果未能解决你的问题,请参考以下文章

mysql里的表怎么改列的默认值

SQL Server 删除表的默认值约束

怎样设置mysql中的数据字段为默认值

将函数输入的默认值设置为等于 Python 中的另一个输入

为表的“id”列指定了多个默认值

使用原始默认属性值将一个表的一部分插入另一个表