【问题标题】:Laravel Migrate char() value as Foreign KeyLaravel 将 char() 值迁移为外键
【发布时间】:2014-07-29 06:53:07
【问题描述】:

我使用 UUID 或 GUID 作为识别某些记录(如用户等)的一种方式。我希望能够通过向用户的唯一 ID 添加外键约束来将某些实体记录链接到用户。

由于某种原因,Migrate 似乎不喜欢添加外键。

有什么建议吗?

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)
        {
            //
        });

我唯一能想到的是在同一个模式构建器中可能有多个外键创建(上图)。但是,外键仍然与同一个表相关。

users 表中的 uuid 列是 char(36) comments 表中的 author_id 列是一个 char(36)

我已多次检查以确保是这种情况。

【问题讨论】:

  • 请发布您的迁移文件。
  • 添加了迁移文件,并解释了它包含的其他内容。我已确保数据库中两列的值和长度相同。
  • 我们还需要查看您的users 迁移代码。
  • users 表已设置。通过此次迁移,users 表中没有任何更改。

标签: laravel-4 migrate


【解决方案1】:

如果您的comments 表中已经有数据,那么当author_id 字段违反foreign_key 约束时会抛出此错误。这可能是因为users.uuid 列中没有的值或表中已经存在的NULL 值。

【讨论】:

  • 两个表都有 0 行。之前已经遇到此错误,必须通过清除它们来对其进行排序。
【解决方案2】:

外键约束似乎只支持以下列数据类型:

INT AUTO_INCREMENT PRIMARY UNIQUE

使用 Laravel 的 Migrate 时。这是因为按照标准,您应该使用

$table->increments('id');

作为您唯一的主键,因此应该是您唯一需要将列值映射到另一个表的记录的东西。这很好,只是不必要的约束。

根据我的发现,添加自定义约束/关系的唯一方法是在您的 Eloquent 模型类中。见Eloquent Relationships

如果有人找到更好的解决方案,我很想知道,但现在我想这会解决。

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 2016-06-06
    • 2019-09-23
    • 2020-03-13
    • 2019-01-31
    • 2014-08-09
    • 2014-09-27
    • 2023-02-06
    • 2014-03-11
    相关资源
    最近更新 更多