我使用UUID或GUID作为识别用户等某些记录的方式。我希望能够通过向用户添加外键约束来将某些实体记录链接到用户ID。
由于某种原因,迁移似乎不喜欢添加外键。
有什么建议吗?
SQLSTATE [HY000]:常规错误:1215无法添加外键约束
这两个值都是CHAR(36)
class CreateForeignKeys extends Migration {
/**
* Run the migrations.
*/
public function up()
{
Schema::table('comments', function($table)
{
$table->foreign('author_id')->references('uuid')->on('users');
});
}
/**
* Reverse the migrations.
*/
public function down()
{
Schema::table('comments', function($table)
{
$table->dropForeign('comments_author_id_foreign');
});
}
}
这是我刚刚在工作中写的东西。唯一的区别是家里的副本有额外的外键创作用于单独的表,但它们有自己的:
Schema::table('table_name', function($table)
{
//
});
我唯一能想到的是在同一个Schema构建器中可能有多个外键创建(上图)。但是,外键仍然与同一个表有关。
uuid
表中的users
列是一个字符(36)
author_id
表中的comments
列是char(36)
我已经多次检查以确保是这种情况。
答案 0 :(得分:0)
如果comments
表中已存在数据,则当author_id
字段违反foreign_key约束时,将抛出此错误。这可能是因为值不在users.uuid
列中,或者因为您的表中已有NULL
值。
答案 1 :(得分:0)
似乎只有以下列数据类型支持外键约束:
INT AUTO_INCREMENT PRIMARY UNIQUE
使用Laravel的Migrate时。这是因为按照标准,您预计会使用
$table->increments('id');
因此,作为唯一的主键,应该是将列值映射到另一个表的记录所需的唯一内容。这没关系,这只是一种不必要的限制。
根据我发现的情况,添加自定义限制/关系的唯一方法是在您的Eloquent Model类中。请参阅Eloquent Relationships。
如果有人找到了更好的解决方案,我很乐意知道,但是现在我想这会做。