【问题标题】:Integrity constraint violation: 1452 Cannot add or update a child row:完整性约束违规:1452 无法添加或更新子行:
【发布时间】:2023-03-23 12:15:01
【问题描述】:

我正在尝试将值插入到我的 cmets 表中,但出现错误。它说我不能添加或更新子行,我不知道这是什么意思。

我的架构看起来像这样

-- ----------------------------
-- 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_fbpj.comments,约束fk_comments_projects1 外键 (project_id) 引用 projects (id) 删除否 更新操作无操作)

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    在我的情况下它不起作用,因为我在模型中的一个名称中留下了一个空格。

    【讨论】:

      【解决方案2】:

      我有一张桌子,里面有一些带有死外国人键的条目。 一旦我清理了表格,我就可以添加一个新的约束。

      DELETE FROM `table_with_bad_entries` WHERE `expected_foreign_key` not in (select `id` from `the_referenced_table`);
      

      【讨论】:

        【解决方案3】:

        问题可能是因为在您尝试添加的带有 project_id 的数据库中找不到项目记录...

        【讨论】:

          【解决方案4】:

          可能是您插入的外键值与主键的值不匹配。

          【讨论】:

            【解决方案5】:

            我刚刚导出了已删除的表,然后再次导入它,它对我有用。这是因为我删除了父表(用户)然后重新创建它,子表(喜欢)具有父表(用户)的外键。

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                【解决方案7】:

                如果您没有按正确的顺序创建和填充表,也会出现此错误。例如,根据您的架构,Comments 表需要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);
                    }
                }
                

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

                【讨论】:

                  【解决方案8】:

                  这意味着表 comments 上列 project_id 的值您不仅要在表项目上插入 doesn't exist BUT 还有 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)。

                  【讨论】:

                    【解决方案9】:

                    如果您向现有表添加新的外键并且列不为空且未分配默认值,您将收到此错误,

                    您需要将其设为nullableassign default valuedelete all the existing records 来解决它。

                    【讨论】:

                    • 使列可以为空解决了这个问题
                    • @ChamupathiGigaraHettige 很高兴它对您有所帮助。 :)
                    【解决方案10】:

                    我希望我的决定会有所帮助。我在 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('cmets')。正确的代码

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

                    【讨论】:

                      【解决方案11】:

                      也许您在表中有一些行要创建 de FK。

                      关闭 foreign_key_checks 运行迁移 仅插入那些在目录表中具有相应 id 字段的记录。

                      【讨论】:

                        【解决方案12】:

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

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

                        然后当我调用我的子类插入子类时,我传递了这个 var 值:

                        $parent->uuid
                        

                        希望对您有所帮助。

                        【讨论】:

                          【解决方案13】:

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

                          【讨论】:

                            【解决方案14】:

                            这只是意味着您要插入的表comments 上的列project_id 的值在表projects 上不存在。请记住,表 comments 上的列 project_id 的值取决于表 Projects 上的 ID 的值。

                            您为列project_id 插入的值50dc845a-83e4-4db3-8705-5432ae7aaee3 在表projects 上不存在。

                            【讨论】:

                            • 如果我在那个表中有值怎么办?我有同样的错误,但我在表和 ID 匹配中有值。
                            • 我遇到了类似的问题。从表中删除旧数据解决了我的问题。
                            • Yojan,我们应该删除哪个表,“父”表还是“子”(依赖)表?
                            【解决方案15】:

                            如果有人在使用 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);
                                }
                            }
                            

                            【讨论】:

                              【解决方案16】:

                              确保您的Comment 模型的fillable 属性中有project_id

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

                              【讨论】:

                              • 这里也一样,使用 Laravel。不错的收获。
                              【解决方案17】:

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

                              【讨论】:

                                猜你喜欢
                                • 2017-04-26
                                • 2015-09-02
                                • 1970-01-01
                                • 2016-05-31
                                • 2018-04-17
                                • 2014-03-12
                                • 2020-09-29
                                • 2020-01-23
                                相关资源
                                最近更新 更多