我正在尝试将值插入到我的评论表中,但是我收到了错误消息。它说我无法添加或更新子行,我不知道这意味着什么。
我的架构看起来像这样
-- ----------------------------
-- 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_fbpj
。comments
,CONSTRAINTfk_comments_projects1
FOREIGN KEY(project_id
)REFERENCESprojects
(id
)ON DELETE NO 更新行动没有行动)
答案 0 :(得分:78)
它只是意味着您要插入的表project_id
上的列comments
的值在表projects
上不存在。请注意,表project_id
上的列comments
的值取决于表ID
上Projects
的值。
表50dc845a-83e4-4db3-8705-5432ae7aaee3
上不存在您为列project_id
插入的值projects
。
答案 1 :(得分:33)
确保project_id
模型的fillable
属性中包含Comment
。
我有同样的问题,这就是原因。
答案 2 :(得分:5)
这意味着表project_id
上列comments
的值不仅是在表项目 BUT 上插入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 :(得分:4)
还要确保您添加的外键与原始列的类型相同,如果您引用的列不是同一类型,它也将失败。
答案 4 :(得分:3)
如果未按正确的顺序创建和填充表,也会收到此错误。例如,根据您的架构,注释表需要user_id
,project_id
,task_id
和data_type_id
。这意味着在您可以引用之前,Users
表,Projects
表,Task
表和Data_Type
表必须已经退出并在其中包含值他们的ID或其他任何列。
在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);
}
}
这就是我解决类似问题的方式。
答案 5 :(得分:1)
如果有人使用Laravel并且遇到此问题。我也得到了这个问题,问题在于我在数据透视表中插入ID(即外键)的顺序。
具体而言,请在下面找到多对多关系的示例:
wordtokens< - > wordtoken_wordchunk< - > wordchunks
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);
}
}
我通过在Wordchunk模型中交换'wordchunk_id'和'wordtoken_id'的顺序来解决问题。
为了完成代码,这就是我坚持模型的方式:
id
答案 6 :(得分:1)
首先删除约束“ fk_comments_projects1”及其索引。之后,重新创建它。
答案 7 :(得分:0)
当我不小心在孩子记录中使用WRONG“ uuid”时遇到了这个问题。发生这种情况时,约束将从子记录到父记录进行查找,以确保链接正确。当我已经装配好模型以自动执行时,我是手动生成它的。所以我的解决方法是:
$parent = Parent:create($recData); // asssigning autogenerated uuid into $parent
然后,当我调用子类以插入子类时,我传递了以下var值:
$parent->uuid
希望有帮助。
答案 8 :(得分:0)
也许您要在表中创建一些行以创建FK。
使用foreign_key_checks OFF运行迁移 在内容表中仅插入具有相应id字段的那些记录。
答案 9 :(得分:0)
我希望我的决定会有所帮助。我在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');
答案 10 :(得分:0)
如果要将新的外键添加到现有表中,并且这些列不是null且未分配默认值,则会出现此错误,
您需要使其为nullable
或assign default value
或delete all the existing records
来解决。
答案 11 :(得分:0)
我遇到了同样的错误,问题是我试图向role_id
表添加users
外来文件,但是role_id
没有默认值,因此数据库做了不允许我插入列,因为我已经有一些用户,并且它不知道如何向他们添加列。
因为我在开发中,所以我只使用migrate:fresh
,但是如果我正在生产中,我可能会为role_id
设置一个默认值,并且直到我在数据库上具有相应角色时才使其不受约束
答案 12 :(得分:0)
可能是您插入的外键值与主键的值不匹配。
答案 13 :(得分:0)
问题可能是因为在您尝试添加的具有 project_id 的数据库中找不到项目记录...
答案 14 :(得分:-1)
我刚刚导出删除的表,然后再次导入它,它对我有用。这是因为我删除了父表(用户)然后重新创建它,子表(喜欢)有父表(用户)的外键。