update - restricciones mysql workbench
Violación de la restricción de integridad: 1452 No se puede agregar o actualizar una fila secundaria: (5)
Estoy tratando de insertar valores en mi tabla de comentarios y obtengo un error. Es decir que no puedo agregar o actualizar la fila secundaria y no tengo idea de lo que eso significa.
mi esquema se ve algo como esto
-- ----------------------------
-- 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'');
y la declaración mysql que estoy tratando de hacer se ve algo como esto
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'')
el error que recibo se ve así
SQLSTATE [23000]: Infracción de restricción de integridad: 1452 No se puede agregar o actualizar una fila secundaria: falla una restricción de clave foránea (
anthonyl_fbpj
.comments
, CONSTRAINTfk_comments_projects1
FOREIGN KEY (project_id
) REFERENCESprojects
(id
.)
Asegúrese de tener project_id
en la propiedad fillable
de su modelo de Comment
.
Tuve el mismo problema, Y esta fue la razón.
Asegúrese también de que la clave externa que agregue sea del mismo tipo que la columna original, si la columna a la que hace referencia no es del mismo tipo, también fallará.
En caso de que alguien esté usando Laravel y esté teniendo este problema. También estaba obteniendo esto y el problema estaba en el orden en el que estaba insertando los identificadores (es decir, las claves externas) en la tabla dinámica.
Para ser concreto, encuentre a continuación un ejemplo para una relación de muchos a muchos:
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'');
});
Ahora mis modelos lucen como sigue:
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'');
}
}
Solucioné el problema intercambiando el orden de ''wordchunk_id'' y ''wordtoken_id'' en el modelo de Wordchunk.
Para completar el código, así es como persisten los modelos:
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);
}
}
Primero elimine la restricción "fk_comments_projects1" y también su índice. Después de eso recrearlo.
Simplemente significa que el valor para la columna project_id
en los comments
tabla que está insertando no existe en los projects
tabla. Tenga en cuenta que los valores de la columna project_id
en los comments
tabla dependen de los valores de ID
en la tabla Projects
.
El valor 50dc845a-83e4-4db3-8705-5432ae7aaee3
que está insertando para la columna project_id
no existe en los projects
tabla.