整合性制約違反: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)REFERENCES projectsid)ON DELETE NO ACTION ON UPDATE NO ACTION)

回答:


123

単に、挿入しているproject_idテーブルの列の値がテーブルにcomments存在しないことを意味しますprojectsproject_idテーブルの列commentsの値はID、テーブルのの値に依存することに注意してくださいProjects

50dc845a-83e4-4db3-8705-5432ae7aaee3列に挿入している値がproject_idテーブルに存在しませんprojects


25
そのテーブルに値がある場合はどうなりますか?同じエラーが発生しましたが、テーブルとIDの値が一致しています。
セルゲイロマノフ

4
同様の問題が発生しました。テーブルから古いデータを削除すると、私の場合の問題は解決しました。
由旬2018年

2
由旬、「親」と「子」(依存)のどちらのテーブルを削除する必要がありますか?
ピーナッツ

46

モデルproject_idfillableプロパティにあることを確認してくださいComment

私も同じ問題を抱えていました、そしてこれが理由でした。


8
ここでも同じですが、Laravelを使用しています。ナイスキャッチ。
PapaHotelPapa 2016年

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、テーブルのプロジェクトにBUTproject_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。つまり、IDまたは他の列を参照する前にUsersProjectsテーブル、テーブル、テーブル、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を使用していて、この問題が発生している場合。私もこれを取得していましたが、問題は、ピボットテーブルに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);
    }
}

2

たぶん、FKを作成したいテーブルにいくつかの行があります。

移行をforeign_key_checksOFFで実行します。コンテンツテーブルに対応するidフィールドを持つレコードのみを挿入します。


1

子供のレコードで誤って間違った「uuid」を使用していたときに、この問題が発生しました。その場合、制約は子から親レコードを調べて、リンクが正しいことを確認します。すでにモデルをリギングして自動的に実行していたときに、手動で生成していました。だから私の修正は:

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

次に、子クラスを呼び出して子を挿入するときに、次のvar値を渡しました。

$parent->uuid

お役に立てば幸いです。


0

同じエラーが発生しました。問題はrole_idusersテーブルに外部を追加しようとしたrole_idが、デフォルト値がなかったため、既にユーザーがいて、列を挿入できなかったため、DBで列を挿入できませんでした。それらに列を追加する方法を知っています。開発中だったので使用したばかりmigrate:freshですが、本番環境の場合は、おそらくデフォルト値をに設定role_idし、DBで対応する役割が得られるまで制約されないようにします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.