স্বচ্ছতা সীমাবদ্ধতা লঙ্ঘন: 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');

এবং যে মাইএসকিএল বিবৃতিটি আমি করার চেষ্টা করছি তা এরকম কিছু দেখাচ্ছে

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')

ত্রুটিটি আমি দেখতে পাই

এসকিউএলসেট [২৩০০০]: স্বতন্ত্রতা সীমাবদ্ধতা লঙ্ঘন: 1452 একটি শিশু সারি যুক্ত বা আপডেট করতে পারে না: একটি বিদেশী কী বাধা ব্যর্থ হয় ( anthonyl_fbpjcomments, বিদেশি কী fk_comments_projects1 ( project_id) সংশোধন projects( id) আপডেট না কোনও পদক্ষেপে কোনও পদক্ষেপ ছাড়ুন )

উত্তর:


124

এটির সহজ অর্থ হ'ল আপনি যে project_idসারণীতে commentsসন্নিবেশ করছেন তার কলামের মান টেবিলটিতে বিদ্যমান নেই projects। মনে রাখবেন যে কলামের মান project_idটেবিলের উপর commentsমান উপর নির্ভরশীল IDটেবিলের উপর Projects

50dc845a-83e4-4db3-8705-5432ae7aaee3কলামের জন্য আপনি যে মানটি সন্নিবেশ করছেন সেটি project_idটেবিলে বিদ্যমান নেই projects


26
আমি কি যদি এই টেবিলের মান আছে? আমার একই ত্রুটি আছে তবে আমার কাছে টেবিল এবং আইডি ম্যাচের মান রয়েছে।
সের্গে রোমানভ

4
আমার একই রকম সমস্যা ছিল। টেবিল থেকে পুরানো ডেটা মুছে ফেলা আমার ক্ষেত্রে সমস্যাটি সমাধান করেছে।
যোজন

4
যোজন, আমাদের কোন টেবিলটি মুছে ফেলা উচিত, "পিতামাতা" বা "শিশু" (নির্ভরশীল) এক?
চিনাবাদাম

46

আপনার সম্পত্তি project_idমধ্যে আছে তা নিশ্চিত করুনfillableComment মডেলটির ।

আমি একই সমস্যা ছিল, এবং এই কারণ ছিল।


8
এখানে একই, লারাভেল ব্যবহার করে। চমৎকার ধরা.
পাপাহোটেলপাপা

8

এছাড়াও নিশ্চিত করুন যে আপনি যে বিদেশী কী যুক্ত করেছেন সেটি একই ধরণের মূল কলামের, আপনি যে কলামটি উল্লেখ করছেন সেটি যদি একই ধরণের না হয় তবে এটিও ব্যর্থ হবে।


5

আপনি যদি বিদ্যমান টেবিলটিতে নতুন বিদেশী কী যুক্ত করে থাকেন এবং কলামগুলি শূন্য না হয় এবং ডিফল্ট মান নির্ধারিত না হয় তবে আপনি এই ত্রুটিটি পেয়ে যাবেন,

হয় আপনাকে এটি তৈরি করতে হবে nullableবা assign default value, বা delete all the existing recordsএটি সমাধান করার প্রয়োজন।


5

মানে যে কলামের জন্য মান project_idটেবিলের উপর commentsআপনি না শুধুমাত্র ঢোকাতে হয় doesn't existটেবিল প্রকল্পে কিন্তু এছাড়াও project_idসম্ভবত ডিফল্ট মান নেই । যেমন আমার ক্ষেত্রে আমি এটিকে NULL হিসাবে সেট করি।

লারাভেল হিসাবে আপনি এই অভিব্যক্তিগুলি মাইগ্রেশন পিএইচপি ফাইলের কোডের একটি অংশ হিসাবে বিবেচনা করতে পারেন, উদাহরণস্বরূপ:

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

}

অবশ্যই এই সমস্ত কিছুর পাশেই আপনাকে মডেল ক্লাস তৈরি করতে হয়েছিল (আমার ক্ষেত্রে এটি ছিল ফটো)।


4

প্রথমে সীমাবদ্ধতা "fk_comments_projects1" এবং এর সূচকটি মুছুন। তারপরে এটি পুনরায় তৈরি করুন।


4

আমি আশা করি আমার সিদ্ধান্ত সাহায্য করবে। লারাভেলে আমারও একই রকম ত্রুটি ছিল। আমি ভুল টেবিলে একটি বিদেশী কী যুক্ত করেছি।
ভুল কোড:

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

3

আপনি যদি সঠিকভাবে আপনার টেবিলগুলি তৈরি এবং পপুলেট না করেন তবে আপনি এই ত্রুটিটিও পাবেন। উদাহরণস্বরূপ, আপনার স্কিমা অনুযায়ী, টেবিল চাহিদা কমেন্ট user_id, project_id, task_idএবং data_type_id। এর অর্থ হ'ল Usersটেবিল, Projectsটেবিল, Taskটেবিল এবং Data_Typeটেবিলটি ইতিমধ্যে উপস্থিত থাকতে হবে এবং সেগুলির মধ্যে মান থাকতে হবে তাদের আইডি বা অন্য কোনও কলামের রেফারেন্স দেওয়ার আগে ।

লারাভেলে এর অর্থ হ'ল সঠিক ডাটাবেসে আপনার ডাটাবেস সিডারদের কল করা:

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

ক্ষেত্রে কেউ লারাভেল ব্যবহার করছে এবং এই সমস্যা হচ্ছে। আমি এটিও পেয়ে যাচ্ছিলাম এবং বিষয়টি পিভট টেবিলের মধ্যে আইডির (যেমন, বিদেশী কীগুলি) সন্নিবেশ করানোর ক্ষেত্রে ছিল।

কংক্রিট হতে, নীচে নীচে থেকে অনেক সম্পর্কে সম্পর্কের:

wordtokens <-> wordtoken_wordchunk <-> ওয়ার্ডচঙ্কস

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

আমি ওয়ার্ডচাঁক মডেলটিতে 'ওয়ার্ডচাঁক_আইডি' এবং 'ওয়ার্ড টোকেন_আইডির' ক্রমটি বিনিময় করে সমস্যার সমাধান করেছি।

কোড সমাপ্তির জন্য, আমি মডেলগুলি এভাবেই চালিয়ে যাই:

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

সম্ভবত আপনার টেবিলে কিছু সারি রয়েছে যা আপনি ডি এফকে তৈরি করতে চান।

বিদেশী_কি_চেকগুলি বন্ধ সহ মাইগ্রেশন চালান কেবল বিষয়বস্তু সারণীতে সংশ্লিষ্ট আইডি ক্ষেত্র রয়েছে এমন রেকর্ডগুলি সন্নিবেশ করুন।


1

আমার সমস্যাটি যখন আমি ঘটনাক্রমে আমার সন্তানের রেকর্ডে WRONG "uuid" ব্যবহার করছিলাম তখন আমার এই সমস্যা হয়েছিল। যখন এটি ঘটে তখন লিঙ্কটি সঠিক কিনা তা নিশ্চিত করতে বাধা বাচ্চা থেকে পিতা-মাতার রেকর্ডে দেখায়। আমি স্বয়ংক্রিয়ভাবে এটি করতে আমার মডেলটিকে ইতিপূর্বে ছড়িয়ে দিয়েছিলাম তখন আমি নিজে এটি তৈরি করেছিলাম। সুতরাং আমার ফিক্সটি ছিল:

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

তারপরে যখন আমি বাচ্চাদের সন্নিবেশ করানোর জন্য আমার শিশু শ্রেণিকে ফোন করেছি, তখন আমি এই ভেরিওটি ​​পাস করেছি:

$parent->uuid

আশা করি এইটি কাজ করবে.


0

আমার একই ত্রুটি ছিল, সমস্যাটি হ'ল আমি টেবিলে role_idবিদেশী যুক্ত করার চেষ্টা করছিলাম users, তবে role_idএকটি ডিফল্ট মান ছিল না, তাই ডিবি আমাকে কলামটি সন্নিবেশ করতে দেয়নি কারণ আমার ইতিমধ্যে কিছু ব্যবহারকারী ছিল এবং এটি ছিল না তাদের কলামটি কীভাবে যুক্ত করবেন তা জানুন। যেহেতু আমি উন্নয়নে ছিলাম আমি কেবল ব্যবহার করেছি migrate:fresh, তবে আমি যদি উত্পাদনে থাকি তবে আমি সম্ভবত ডিফল্ট মান নির্ধারণ role_idকরতাম এবং ডিবিতে আমার সংশ্লিষ্ট ভূমিকা না পাওয়া পর্যন্ত এটি সীমাবদ্ধ না রাখতাম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.