Я пытаюсь вставить значения в свою таблицу комментариев и получаю сообщение об ошибке. В нем говорится, что я не могу добавлять или обновлять дочернюю строку, и я понятия не имею, что это значит.
моя схема выглядит примерно так
-- ----------------------------
-- 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
) ПРИ УДАЛЕНИИ НЕТ ДЕЙСТВИЙ ПРИ ОБНОВЛЕНИИ НЕТ ДЕЙСТВИЙ)
Убедитесь, что у вас есть
project_id
вfillable
собственности вашаComment
модель.У меня была такая же проблема, и это было причиной.
источник
Также убедитесь, что внешний ключ, который вы добавляете, относится к тому же типу, что и исходный столбец, если столбец, на который вы ссылаетесь, не того же типа, он тоже не будет работать.
источник
Если вы добавляете новый внешний ключ в существующую таблицу, а столбцы не являются нулевыми и не имеют значения по умолчанию, вы получите эту ошибку,
Либо вам нужно сделать это
nullable
илиassign default value
, илиdelete all the existing records
ее решить.источник
это означает, что значение для столбца
project_id
в таблице, котороеcomments
вы вставляете не толькоdoesn't exist
в проекты таблиц, НО также,project_id
вероятно , не имеет значения по умолчанию . Например, в моем случае я установил его как NULL.Что касается Laravel, вы можете рассматривать эти выражения как фрагмент кода php-файла миграции, например:
{ /** * Run the migrations. * * @return void */
}
Очевидно, вам нужно было создать класс Model (в моем случае это Photo) рядом со всем этим.
источник
Сначала удалите ограничение «fk_comments_projects1», а также его индекс. После этого воссоздайте его.
источник
Надеюсь, мое решение поможет. У меня была аналогичная ошибка в 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'); ... });
Обратите внимание на функцию в («комментарии») выше. Правильный код
источник
Вы также получите эту ошибку, если не создадите и не заполните таблицы в правильном порядке. Например, в соответствии с вашей схемой, Комментарии потребности таблицы
user_id
,project_id
,task_id
иdata_type_id
. Это означает, чтоUsers
таблица,Projects
таблица,Task
таблица иData_Type
таблица должны быть уже завершены и иметь в них значения, прежде чем вы сможете ссылаться на их идентификаторы или любой другой столбец.В 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); } }
Так я решил похожую проблему.
источник
Если кто-то использует 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'); });
Теперь мои модели выглядят следующим образом:
Я исправил проблему, изменив порядок «wordchunk_id» и «wordtoken_id» в модели Wordchunk.
Для завершения кода я сохраняю модели следующим образом:
источник
Возможно, у вас есть строки в таблице, которые вы хотите создать де ФК.
Запустите миграцию с параметром foreign_key_checks OFF Вставьте только те записи, которые имеют соответствующее поле id в таблице содержимого.
источник
У меня возникла эта проблема, когда я случайно использовал НЕПРАВИЛЬНЫЙ uuid в своей дочерней записи. Когда это происходит, ограничение смотрит с дочерней на родительскую запись, чтобы убедиться, что ссылка верна. Я создавал его вручную, когда я уже настроил свою Модель на автоматическое выполнение. Итак, мое исправление было:
$parent = Parent:create($recData); // asssigning autogenerated uuid into $parent
Затем, когда я вызвал свой дочерний класс для вставки дочерних элементов, я передал это значение var:
Надеюсь, это поможет.
источник
У меня была такая же ошибка, проблема заключалась в том, что я пытался добавить
role_id
чужое вusers
таблицу, ноrole_id
не имел значения по умолчанию, поэтому БД не позволяла мне вставлять столбец, потому что у меня уже были некоторые пользователи, а он не знаю, как добавить к ним столбец. Поскольку я был в разработке, я просто использовалmigrate:fresh
, но если бы я был в производстве, я бы, вероятно, установил значение по умолчанию дляrole_id
и не делал бы его неограниченным, пока у меня не была бы соответствующая роль в БД.источник