2012-12-28 44 views
43

我試圖插入值到我的評論表中,我收到錯誤。它說我不能添加或更新子行,我不知道這意味着什麼。完整性約束違規:1452無法添加或更新子行:

我的架構看起來像這樣

-- ---------------------------- 
-- 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,約束fk_comments_projects1 外鍵(project_id)參考文獻projectsid)ON DELETE NO 行動UPDATE NO ACTION)

回答

56

它只是簡單的說就是在表comments要插入的project_id列中的值不存在於表projects。請記住,表comments上的列project_id的值取決於表Projects上的ID的值。

您爲插入列project_id的值50dc845a-83e4-4db3-8705-5432ae7aaee3在表projects上不存在。

+14

如果我確實有在該表中的值?我有同樣的錯誤,但我有表和ID匹配的值。 –

+0

我有類似的問題。刪除表中的舊數據解決了我的情況中的問題。 – Yojan

28

確保您在Comment模型的fillable屬性中有project_id

我有同樣的問題,這就是原因。

+4

同樣在這裏,使用Laravel。很好的接收。 – PapaHotelPapa

3

還要確保您添加的外鍵與原始列的類型相同,如果您參考的列不是相同的類型,它也會失敗。

1

如果有人使用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); 
    } 
} 
相關問題