usar update restricción restricciones referencial puede integridad externa dominio delete como clave cascada agregar mysql sql

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 , CONSTRAINT fk_comments_projects1 FOREIGN KEY ( project_id ) REFERENCES projects ( 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.