【问题标题】:What does this SQL error mean? [duplicate]这个 SQL 错误是什么意思? [复制]
【发布时间】:2016-03-24 06:35:30
【问题描述】:

在 Laravel 上运行迁移时出现以下错误。当它到达更新用户表的迁移部分时,似乎出现了错误。

SQLSTATE[23000]: Integrity constraint violation: 1452
Cannot add or update a child row: a foreign key constraint fails
(`priatek`.`#sql-52e_a`, CONSTRAINT user_usertypeid_foreign` FOREIGN KEY
(userTypeId`) REFERENCES `UserType` (`userTypeId`))
(SQL: alter table `User` add constraint user_usertypeid_foreign foreign key
(`userTypeId`) references UserType` (`userTypeId`))

迁移

public function up()
{
    Schema::create('UserType', function (Blueprint $table) {
        $table->increments('userTypeId');
        $table->string('name');
        $table->string('description')->nullable();
        $table->boolean('viewUser');
        $table->boolean('viewSponsor');
        $table->boolean('viewQuestion');
        $table->boolean('createUser');
        $table->boolean('createSponsor');
        $table->boolean('createQuestion');
    });

    UserType::create([
        'name'           => 'Executive',
        'viewUser'       => 0,
        'viewSponsor'    => 1,
        'viewQuestion'   => 0,
        'createUser'     => 0,
        'createSponsor'  => 0,
        'createQuestion' => 0,
    ]);

    //more UserType creations...

    Schema::table('User', function ($table) {
        $table->integer('userTypeId')->unsigned();
        $table->integer('operatorId')->unsigned();
        $table->integer('sponsorId')->unsigned()->nullable();

        $table->foreign('userTypeId')->references('userTypeId')->on('UserType');
    });

    // more unrelated stuff...
}

【问题讨论】:

  • 您正在尝试插入(更新)一个已经存在的键......

标签: mysql laravel foreign-keys migration


【解决方案1】:

问题是当您将外键添加到表中时,您的所有用户都必须已经有一个有效的 userTypeId。但是因为您刚刚创建了那个新列,所以他们不会有这个。

在您可以创建外键之前,您必须确保所有用户都具有有效的用户类型(需要创建用户类型并为每个用户正确设置 userTypeId)。

因此,您需要做的是在User 表中添加额外的列,然后运行一些更新查询以确保所有用户都设置了userTypeId,然后在更新完成后添加外键。

【讨论】:

  • 我明白你的意思,它为那些新的外键输入 0。我让它们可以为空,因为某些用户可能属于“管理员”类型,而这些外键与他们无关。
  • 诚然,我不知道可以为空的外键不仅是可能的,而且推荐用于此类情况,所以我很高兴你解释了,因为我不认为这是一个解决方案。
  • 我也不知道:/。从长远来看,我会知道它是否适用于这个项目。
猜你喜欢
  • 2015-07-05
  • 1970-01-01
  • 2012-11-18
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多