在 laravel 迁移中使用 UUID 作为默认值
Posted
技术标签:
【中文标题】在 laravel 迁移中使用 UUID 作为默认值【英文标题】:Using UUID as default value in a laravel migration 【发布时间】:2019-07-18 20:57:26 【问题描述】:我有以下迁移:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class UpdateRatingGameUserAnswersTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::table('rating_games_user_answers', function (Blueprint $table)
$table->uuid('answer_token')->default(DB::raw('UUID()'));
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::table('rating_games_user_answers', function (Blueprint $table)
$table->dropColumn('answer_token');
);
如您所见,我正在尝试将 UUID 设置为默认值。我看过here
但是当我运行php artisan migrate
时,我看到以下内容:
怎么了?
【问题讨论】:
UUID() 是 mysql 中的触发器吗? 我记得。 UUID() 是 mysql 中的默认函数。见这里mysqlserverteam.com/storing-uuid-values-in-mysql-tables 例如,请求SELECT UUID()
给了我uuid。
【参考方案1】:
当我遇到同样的问题时遇到了这个问题: 在 MySQL 8 中,您可以使用函数作为默认值。但是你需要在它们周围加上括号。所以这行得通:
$table->uuid('uid')->default(DB::raw('(UUID())'));
但这与 MySQL 5.7 不兼容!
【讨论】:
你是个圣人。谢谢。【参考方案2】:你不能使用 mySQL 函数作为默认值,要么设置它,要么使用触发器。
请像这样尝试:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class UpdateRatingGameUserAnswersTable extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
Schema::table('rating_games_user_answers', function (Blueprint $table)
$uuid = DB::raw('select UUID()');
$table->uuid('answer_token')->default($uuid);
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::table('rating_games_user_answers', function (Blueprint $table)
$table->dropColumn('answer_token');
);
【讨论】:
为什么?例如,我可以使用NOW()
。这是工作。我已将代码更新为$table->dateTime('answer_token')->default(DB::raw('NOW()'));
,效果很好。我可以在我的数据库中看到默认的 dateTime 值。
NOW() 这可能是一个例外,但请参阅此处forums.mysql.com/read.php?10,91149,91161#msg-91161
对不起,我不明白。我还没有为NOW()
编写触发器,它可以工作。 NOW()
和 UUID()
之间的区别。两者都是函数,对吧?从您的链接中,我了解到我需要触发呼叫UUID()
。那么为什么我不必为NOW()
这样做呢?
通常它不应该工作 With one exception, the default value specified in a DEFAULT clause must be a literal constant; it cannot be a function or an expression. This means, for example, that you cannot set the default for a date column to be the value of a function such as NOW() or CURRENT_DATE.
dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html 至于你的问题触发器或预查询应该解决它。以上是关于在 laravel 迁移中使用 UUID 作为默认值的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.2 使用 uuid 字符串作为 id 的隐式路由模型绑定
Laravel 5.8 错误 SQLSTATE[HY000]: 一般错误: 1005 uuid
使用 Laravel 关系 orm 时 UUID 二进制(16)的问题