违反完整性约束:1452无法添加或更新子行:


84

我试图在我的注释表中插入值,但出现错误。俗话说,我不能添加或更新子行,我也不知道这意味着什么。

我的架构看起来像这样

-- ----------------------------
-- Table structure for `comments`
-- ----------------------------
DROP TABLE IF EXISTS `comments`;
CREATE TABLE `comments` (
  `id` varchar(36) NOT NULL,
  `project_id` varchar(36) NOT NULL,
  `user_id` varchar(36) NOT NULL,
  `task_id` varchar(36) NOT NULL,
  `data_type_id` varchar(36) NOT NULL,
  `data_path` varchar(255) DEFAULT NULL,
  `message` longtext,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_comments_users` (`user_id`),
  KEY `fk_comments_projects1` (`project_id`),
  KEY `fk_comments_data_types1` (`data_type_id`),
  CONSTRAINT `fk_comments_data_types1` FOREIGN KEY (`data_type_id`) REFERENCES `data_types` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_comments_projects1` FOREIGN KEY (`project_id`) REFERENCES `projects` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_comments_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf32;

-- ----------------------------
-- Records of comments
-- ----------------------------

-- ----------------------------
-- Table structure for `projects`
-- ----------------------------
DROP TABLE IF EXISTS `projects`;
CREATE TABLE `projects` (
  `id` varchar(36) NOT NULL,
  `user_id` varchar(36) NOT NULL,
  `title` varchar(45) DEFAULT NULL,
  `description` longtext,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_projects_users1` (`user_id`),
  CONSTRAINT `fk_projects_users1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf32;

-- ----------------------------
-- Records of projects
-- ----------------------------
INSERT INTO `projects` VALUES ('50dcbc72-3410-4596-8b71-0e80ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', 'Brand New Project', 'This is a brand new project', '2012-12-27 15:24:02', '2012-12-27 15:24:02');

和我试图做的mysql语句看起来像这样

INSERT INTO `anthonyl_fbpj`.`comments` (`project_id`, `user_id`, `task_id`, `data_type_id`, `message`, `modified`, `created`, `id`) 
VALUES ('50dc845a-83e4-4db3-8705-5432ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', '1', '50d32e5c-abdc-491a-a0ef-25d84e9f49a8', 'this is a test', '2012-12-27 19:20:46', '2012-12-27 19:20:46', '50dcf3ee-8bf4-4685-aa45-4eb4ae7aaee3')

我得到的错误看起来像这样

SQLSTATE [23000]:违反完整性约束:1452无法添加或更新子行:外键约束失败(anthonyl_fbpjcomments,CONSTRAINT fk_comments_projects1 FOREIGN KEY(project_id)引用projectsid)删除无操作,更新无操作)

Answers:


123

这只是意味着您要插入的project_id表上的column的值在tablecomments上不存在projects。请记住,列的值project_id上表comments是依赖于值IDProjects

50dc845a-83e4-4db3-8705-5432ae7aaee3您要为column插入的值project_id在table上不存在projects


25
如果我在那张桌子上确实有价值,该怎么办?我有相同的错误,但表和ID匹配中有值。
谢尔盖·罗曼诺夫

4
我有一个类似的问题。从表中删除旧数据解决了我的问题。
Yojan

2
Yojan,我们应该删除哪个表,“父”表或“子”表(从属表)?
花生

46

确保您拥有模型project_idfillable属性Comment

我有同样的问题,这就是原因。


8
同样,使用Laravel。不错的收获。
PapaHotelPapa

8

还要确保您添加的外键与原始列的类型相同,如果您引用的列不是同一类型,它也会失败。


5

如果您要将新的外键添加到现有表中,并且这些列不是null且未分配默认值,则会出现此错误,

您需要制造nullableassign default value,或delete all the existing records解决它。


4

首先删除约束“ fk_comments_projects1”及其索引。之后,重新创建它。


4

希望我的决定会有所帮助。我在Laravel中有一个类似的错误。我在错误的表中添加了外键。
错误的代码:

Schema::create('comments', function (Blueprint $table) {
$table->unsignedBigInteger('post_id')->index()->nullable();
...
$table->foreign('post_id')->references('id')->on('comments')->onDelete('cascade');
    });


Schema::create('posts', function (Blueprint $table) {
    $table->bigIncrements('id');
    ...
    });

请注意上面的on('comments')函数。正确的代码

 $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');

4

这意味着,对于列中的值project_id上表中comments要插入不仅doesn't exist在表的项目project_id可能没有默认值。例如,在我的情况下,将其设置为NULL。

至于Laravel,您可以将此表达式视为迁移php文件的代码块,例如:

class ForeinToPhotosFromUsers extends Migration

{ /** * Run the migrations. * * @return void */

public function up()
{
    Schema::table('users', function (Blueprint $table) {
    $table->unsignedBigInteger('photo_id')->nullable();// ! ! ! THIS STRING ! ! !
    $table->foreign('photo_id')->references('id')->on('photos');
});
}

}

显然,您必须在所有这些旁边创建Model类(在我的情况下是Photo)。


3

如果未按正确的顺序创建和填充表,也会收到此错误。例如,根据您的模式,留言表的需求user_idproject_idtask_iddata_type_id。这意味着Users表,Projects表,Task表和Data_Type必须已经退出并在其中具有值,然后才能引用它们的ID或任何其他列。

在Laravel中,这意味着以正确的顺序调用数据库种子:

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UserSeeder::class);
        $this->call(ProjectSeeder::class);
        $this->call(TaskSeeder::class);
        $this->call(DataTypeSeeder::class);
        $this->call(CommentSeeder::class);
    }
}

这就是我解决类似问题的方式。


2

如果有人正在使用Laravel并遇到此问题。我也得到了这个,问题出在将ID(即外键)插入数据透视表的顺序中。

具体而言,请在下面找到多对多关系的示例:

wordtokens <-> wordtoken_wordchunk <-> wordchunks

// wordtoken_wordchunk table
Schema::create('wordtoken_wordchunk', function(Blueprint $table) {
        $table->integer('wordtoken_id')->unsigned();
        $table->integer('wordchunk_id')->unsigned();

        $table->foreign('wordtoken_id')->references('id')->on('word_tokens')->onDelete('cascade');
        $table->foreign('wordchunk_id')->references('id')->on('wordchunks')->onDelete('cascade');

        $table->primary(['wordtoken_id', 'wordchunk_id']);
    });

// wordchunks table
Schema::create('wordchunks', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->string('text');
    });

// wordtokens table
Schema::create('word_tokens', function (Blueprint $table) {
        $table->increments('id');
        $table->string('text');
});

现在,我的模型如下所示:

class WordToken extends Model
{
   public function wordchunks() {
      return $this->belongsToMany('App\Wordchunk');
   }
}

class Wordchunk extends Model
{

    public function wordTokens() {
        return $this->belongsToMany('App\WordToken', 'wordtoken_wordchunk', 'wordchunk_id', 'wordtoken_id');
    }
}

我通过在Wordchunk模型中交换'wordchunk_id'和'wordtoken_id'的顺序来解决此问题。

对于代码完成,这是我保持模型的方式:

private function persistChunks($chunks) {
    foreach ($chunks as $chunk) {
        $model = new Wordchunk();
        $model->text = implode(' ', array_map(function($token) {return $token->text;}, $chunk));
        $tokenIds = array_map(function($token) {return $token->id;}, $chunk);
        $model->save();
        $model->wordTokens()->attach($tokenIds);
    }
}


1

当我不小心在孩子记录中使用WRONG“ uuid”时遇到了这个问题。发生这种情况时,约束将从子记录到父记录查找,以确保链接正确。当我已经装配好模型以自动执行时,我是手动生成它的。所以我的解决方法是:

$parent = Parent:create($recData); // asssigning autogenerated uuid into $parent

然后,当我调用子类以插入子类时,我传递了以下var值:

$parent->uuid

希望能有所帮助。


0

我遇到了同样的错误,问题是我试图向表中添加role_id外文users,但role_id没有默认值,所以数据库不允许我插入列,因为我已经有一些用户,并且没有知道如何将列添加到他们。由于我只是在开发中,所以我只是在使用它migrate:fresh,但是如果我在生产中,则可能会将默认值设置为,role_id并且在我在数据库上具有相应角色之前不要使其不受约束。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.