Estoy intentando insertar valores en mi tabla de comentarios y recibo un error. Está diciendo que no puedo agregar o actualizar la fila secundaria y no tengo idea de lo que eso significa.
mi esquema se parece a 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 de mysql que estoy tratando de hacer se parece a 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 parece a esto
SQLSTATE [23000]: Violación de restricción de integridad: 1452 No se puede agregar o actualizar una fila secundaria: falla una restricción de clave externa (
anthonyl_fbpj
.comments
, CONSTRAINTfk_comments_projects1
FOREIGN KEY (project_id
) REFERENCESprojects
(id
) ON DELETE NO ACTION ON UPDATE NO ACTION)
Asegúrese de tener
project_id
en lafillable
propiedad de suComment
modelo.Tuve el mismo problema, y esta fue la razón.
fuente
También asegúrese 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á.
fuente
Si está agregando una nueva clave externa a una tabla existente y las columnas no son nulas y no se les asigna un valor predeterminado, obtendrá este error,
Ya sea que usted necesita para que sea
nullable
oassign default value
, odelete all the existing records
para resolverlo.fuente
Primero elimine la restricción "fk_comments_projects1" y también su índice. Después de eso, recréalo.
fuente
Espero que mi decisión ayude. Tuve un error similar en Laravel. Agregué una clave externa a la tabla incorrecta.
Codigo erroneo:
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'); ... });
Tenga en cuenta la función en ('comentarios') anterior. Código correcto
fuente
Esto significa que el valor de la columna
project_id
en la tablacomments
que va a insertar no sólodoesn't exist
en proyectos de mesa pero tambiénproject_id
, probablemente, no tiene valor predeterminado . Por ejemplo, en mi caso lo configuré como NULL.En cuanto a Laravel, puede considerar estas expresiones como un fragmento de código de un archivo php de migración, por ejemplo:
{ /** * Run the migrations. * * @return void */
}
Obviamente tenías que crear la clase Model (en mi caso era Photo) junto a todas estas.
fuente
También obtiene este error si no crea y completa sus tablas en el orden correcto. Por ejemplo, de acuerdo con el esquema, comentarios necesidades de mesa
user_id
,project_id
,task_id
ydata_type_id
. Esto significa que laUsers
tabla, laProjects
tabla, laTask
tabla y laData_Type
tabla ya deben haber salido y tener valores antes de poder hacer referencia a sus ID o cualquier otra columna.En Laravel, esto significaría llamar a las sembradoras de su base de datos en el orden correcto:
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); } }
Así fue como resolví un problema similar.
fuente
En caso de que alguien esté usando Laravel y tenga este problema. También recibía 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 de 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 se ven así:
Solucioné el problema intercambiando el orden de 'wordchunk_id' y 'wordtoken_id' en el modelo Wordchunk.
Para completar el código, así es como conservo los modelos:
fuente
Tal vez tenga algunas filas en la tabla que desee crear de FK.
Ejecute la migración con Foreign_key_checks OFF Inserte solo aquellos registros que tengan el campo de identificación correspondiente en la tabla de contenido.
fuente
Tuve este problema cuando usé accidentalmente el "uuid" INCORRECTO en el registro de mi hijo. Cuando eso sucede, la restricción mira desde el registro secundario al primario para asegurarse de que el vínculo sea correcto. Lo estaba generando manualmente, cuando ya había manipulado mi modelo para que lo hiciera automáticamente. Entonces mi solución fue:
$parent = Parent:create($recData); // asssigning autogenerated uuid into $parent
Luego, cuando llamé a mi clase secundaria para insertar niños, pasé este valor de var:
Espero que ayude.
fuente
Tuve el mismo error, el problema era que estaba intentando agregar elementos
role_id
externos a lausers
tabla, perorole_id
no tenía un valor predeterminado, por lo que la base de datos no me permitió insertar la columna porque ya tenía algunos usuarios y no saber cómo agregarles la columna. Como estaba en desarrollo, acabo de usarmigrate:fresh
, pero si estuviera en producción, probablemente establecería un valor predeterminado enrole_id
y no lo haría no restringido hasta que tuviera el rol correspondiente en la base de datos.fuente