Порушення обмеження цілісності: 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]: Integrity порушення обмеження: 1452 Неможливо додати або оновити дочірню рядок: обмеження зовнішнього ключа зазнає невдачі ( anthonyl_fbpj. comments, CONSTRAINT fk_comments_projects1 FOREIGN KEY ( project_id) СПИСОК ЛІТЕРАТУРИ projects( id) ON DELETE NO ACTION ON UPDATE NO ACTION)

Відповіді:


124

Це просто означає, що значення для стовпця project_idтаблиці, commentsяку ви вставляєте, не існує в таблиці projects. Майте на увазі, що значення стовпця project_idв таблиці commentsзалежать від значень у IDтаблиці Projects.

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


25
Що робити, якщо я маю значення в цій таблиці? У мене однакова помилка, але значення в таблиці та ідентифікаторі відповідають.
Сергій Романов

4
У мене була подібна проблема. Видалення старих даних із таблиці вирішило проблему в моєму випадку.
Йоджан,

2
Йоджане, яку таблицю слід видалити, «батьківську» чи «дочірню» (залежну)?
Арахіс

46

Переконайтеся , що у вас є project_idв fillableвласності вашої Commentмоделі.

У мене була та сама проблема, і це було причиною.


8
Те саме тут, використовуючи Laravel. Хороший улов.
PapaHotelPapa

8

Також переконайтеся, що зовнішній ключ, який ви додаєте, є однаковим типом вихідного стовпця, якщо стовпець, на який ви посилаєтесь, не того самого типу, він теж не вдасться.


5

Якщо ви додаєте новий зовнішній ключ до існуючої таблиці, а стовпці не є нульовими і не присвоєно значення за замовчуванням, ви отримаєте цю помилку,

Або вам потрібно це зробити, nullableабо assign 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');
    ...
    });

Зверніть увагу на функцію на ("коментарі") вище. Правильний код

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

Так я вирішив подібне питання.


2

Якщо хтось використовує 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);
    }
}

2

Можливо, у вас є кілька рядків у таблиці, які ви хочете створити de FK.

Запустіть міграцію з Foreign_key_checks OFF Вставте лише ті записи, які мають відповідне поле id у таблиці вмісту.


1

У мене виникла ця проблема, коли я випадково використовував НЕПРАВИЛЬНИЙ "uuid" у своєму дочірньому записі. Коли це трапляється, обмеження переглядається з дочірнього на батьківський запис, щоб переконатися, що посилання правильне. Я генерував його вручну, коли я вже сформував свою Модель, щоб зробити це автоматично. Отже, моє виправлення було:

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

Потім, коли я зателефонував своєму дочірньому класу, щоб вставити дітей, я передав це значення var:

$parent->uuid

Сподіваюся, що це допомагає.


0

У мене була та сама помилка, проблема полягала в тому, що я намагався додати role_idсторонні дані до usersтаблиці, але role_idне мав значення за замовчуванням, тому БД не дозволила мені вставити стовпець, оскільки у мене вже було кілька користувачів, і він не знати, як до них додати стовпець. Оскільки я був у розробці, я щойно використовував migrate:fresh, але якби я працював у виробництві, я б, мабуть, встановив значення за замовчуванням для role_idі не робив би його обмеженим, поки не отримав відповідну роль у БД.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.