Подтвердить что ты не робот

Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку:

Я пытаюсь вставить значения в мою таблицу комментариев, и я получаю сообщение об ошибке. Его высказывание, что я не могу добавить или обновить дочернюю строку, и я понятия не имею, что это значит.

моя схема выглядит примерно так:

-- ----------------------------
-- 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, CONSTRAINT fk_comments_projects1ИНОСТРАННЫЙ КЛЮЧ (project_id) ССЫЛКИ projects (id) ВКЛ УДАЛИТЬ НЕТ ACTION ON UPDATE NO ACTION)

4b9b3361

Ответ 1

Это просто означает, что значение для столбца project_id в таблице comments, которое вы вставляете, не существует в таблице projects. Имейте в виду, что значения столбца project_id в таблице comments зависят от значений ID в таблице projects.

Значение 50dc845a-83e4-4db3-8705-5432ae7aaee3, которое вы вставляете для столбца project_id, не существует в таблице projects.

Ответ 2

Убедитесь, что у вас есть project_id в свойстве fillable вашей модели Comment.

У меня была одна и та же проблема, и именно по этой причине.

Ответ 3

Также убедитесь, что добавленный вами внешний ключ - это тот же тип исходного столбца, если столбец, на который вы ссылаетесь, не является тем же типом, он тоже не сработает.

Ответ 4

Если кто-то использует Laravel и получает эту проблему. Я тоже получал это, и проблема была в том порядке, в котором я вставлял идентификаторы (т.е. Внешние ключи) в сводную таблицу.

Чтобы быть конкретным, найдите ниже пример для отношения многих и многих:

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_id" и "wordtoken_id" в модели Wordchunk.

Для завершения кода это то, как я сохраняю модели:

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

Ответ 5

Сначала удалите ограничение "fk_comments_projects1", а также его индекс. После этого воссоздай это.

Ответ 6

У меня была эта проблема, когда я случайно использовал НЕПРАВИЛЬНОЕ "uuid" в своей записи о детях. Когда это происходит, ограничение переходит от дочерней к родительской записи, чтобы убедиться, что ссылка верна. Я генерировал его вручную, когда уже настроил свою модель, чтобы сделать это автоматически. Итак, мое решение было:

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

Затем, когда я вызвал свой дочерний класс для вставки потомков, я передал это значение var:

$parent->uuid

Надеюсь, это поможет.

Ответ 7

Может быть, у вас есть несколько строк в таблице, которые вы хотите создать де FK.

Запустить миграцию с Foreign_key_checks OFF. Вставить только те записи, которые имеют соответствующее поле id в таблице содержимого.

Ответ 8

Я надеюсь, что мое решение поможет. У меня была похожая ошибка в 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');
    ...
    });

Обратите внимание на функцию ("комментарии") выше. Правильный код

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