अखंडता बाधा उल्लंघन: 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 [23,000]: अखंडता बाधा उल्लंघन: 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


25
क्या होगा यदि मेरे पास उस तालिका में मूल्य है? मेरे पास एक ही त्रुटि है लेकिन मेरे पास टेबल और आईडी मैच में मान हैं।
सेर्गेई रोमानोव

4
मेरे पास एक समान मुद्दा था। तालिका से पुराने डेटा को हटाने से मेरे मामले में समस्या हल हो गई।
योजना 10

2
योजना, हमें "माता-पिता" या "बच्चे" (आश्रित) को किस तालिका से हटाना चाहिए?
मूंगफली

46

सुनिश्चित करें कि आपके पास अपने मॉडल project_idकी fillableसंपत्ति है Comment

मेरे पास एक ही मुद्दा था, और यही कारण था।


8
यहाँ, लारवेल का उपयोग करते हुए। अच्छा पकड़ा।
पापा मोटेलपापा

8

यह भी सुनिश्चित करें कि आपके द्वारा जोड़ी गई विदेशी कुंजी एक ही प्रकार का मूल कॉलम है, यदि आपके द्वारा संदर्भित कॉलम समान प्रकार नहीं है तो यह भी विफल हो जाएगा।


5

यदि आप किसी मौजूदा तालिका में नई विदेशी कुंजी जोड़ रहे हैं और कॉलम शून्य नहीं हैं और डिफ़ॉल्ट मान असाइन नहीं किए गए हैं, तो आपको यह त्रुटि मिलेगी,

या तो आप इसे बनाने की जरूरत है nullableया assign default value, या delete all the existing recordsइसे हल करने की।



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

4

इसका मतलब है कि project_idटेबल पर कॉलम के लिए मूल्य commentsआप न केवल doesn't existटेबल परियोजनाओं पर डाल रहे हैं, बल्किproject_id संभवतः डिफ़ॉल्ट मान भी नहीं है । जैसे मेरे मामले में मैंने इसे NULL के रूप में सेट किया है।

उदाहरण के लिए, लारवेल के रूप में आप इस अभिव्यक्ति को एक माइग्रेशन 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');
});
}

}

जाहिर है कि आपको इन सभी के बगल में मॉडल वर्ग (मेरे मामले में यह फोटो था) बनाना था।


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

मैंने वर्डचंक मॉडल में 'वर्डचंक_आईडी' और 'वर्डटोकन_आईडी' के क्रम का आदान-प्रदान करके समस्या को ठीक किया।

कोड पूरा होने के लिए, यह है कि मैं मॉडल कैसे जारी रखता हूं:

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

मेरे पास यह मुद्दा था जब मैं गलती से अपने बच्चे के रिकॉर्ड में गलत "यूआईडी" का उपयोग कर रहा था। जब ऐसा होता है तो यह सुनिश्चित करने के लिए कि माता-पिता के रिकॉर्ड में बाधा सही है, यह सुनिश्चित करने के लिए कि लिंक सही है। मैं इसे मैन्युअल रूप से उत्पन्न कर रहा था, जब मैंने अपने मॉडल को पहले से ही स्वचालित रूप से करने के लिए धांधली की थी। तो मेरा फिक्स था:

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

फिर जब मैंने बच्चों को सम्मिलित करने के लिए अपने बच्चे को कक्षा में बुलाया, तो मैंने यह संस्करण मान पारित किया:

$parent->uuid

उम्मीद है की वो मदद करदे।


0

मेरे पास एक ही त्रुटि थी, समस्या यह थी कि मैं तालिका में role_idविदेशी जोड़ने की कोशिश कर रहा था users, लेकिन role_idडिफ़ॉल्ट मान नहीं था, इसलिए डीबी ने मुझे कॉलम डालने की अनुमति नहीं दी क्योंकि मेरे पास पहले से ही कुछ उपयोगकर्ता थे और यह नहीं था उनके साथ कॉलम जोड़ना जानते हैं। चूंकि मैं विकास में था, मैं बस इस्तेमाल करता था migrate:fresh, लेकिन अगर मैं उत्पादन पर था, तो मैं शायद एक डिफ़ॉल्ट मान सेट कर दूंगा role_idऔर इसे तब तक बाधित नहीं करूंगा जब तक कि मेरे पास डीबी पर समान भूमिका न हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.