Violación de la restricción de integridad: 1452 No se puede agregar o actualizar una fila secundaria:

84

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, CONSTRAINT fk_comments_projects1 FOREIGN KEY ( project_id) REFERENCES projects( id) ON DELETE NO ACTION ON UPDATE NO ACTION)

numérico25
fuente

Respuestas:

123

Simplemente significa que el valor de la columna project_iden la tabla commentsque está insertando no existe en la tabla projects. Tenga en cuenta que los valores de la columna project_idde la tabla commentsdependen de los valores de la IDtabla Projects.

El valor 50dc845a-83e4-4db3-8705-5432ae7aaee3que está insertando para la columna project_idno existe en la tabla projects.

John Woo
fuente
25
¿Qué pasa si tengo valor en esa tabla? Tengo el mismo error pero tengo valores en la tabla y coincidencia de ID.
Sergey Romanov
4
Tuve un problema similar. Eliminar los datos antiguos de la tabla resolvió el problema en mi caso.
Yojan
2
Yojan, ¿qué tabla deberíamos eliminar, la "principal" o la "secundaria" (dependiente)?
Peanuts
46

Asegúrese de tener project_iden la fillablepropiedad de su Commentmodelo.

Tuve el mismo problema, y ​​esta fue la razón.

Jyothu
fuente
8
Lo mismo aquí, usando Laravel. Buena atrapada.
PapaHotelPapa
8

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
5

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 nullableo assign default value, o delete all the existing recordspara resolverlo.

Prafulla Kumar Sahu
fuente
4

Primero elimine la restricción "fk_comments_projects1" y también su índice. Después de eso, recréalo.

Sreerag AS
fuente
4

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

 $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
Aleksergio
fuente
4

Esto significa que el valor de la columna project_iden la tabla commentsque va a insertar no sólo doesn't existen proyectos de mesa pero también project_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:

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');
});
}

}

Obviamente tenías que crear la clase Model (en mi caso era Photo) junto a todas estas.

CodeToLife
fuente
3

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_idy data_type_id. Esto significa que la Userstabla, la Projectstabla, la Tasktabla y la Data_Typetabla 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.

KC Samm
fuente
2

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í:

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 Wordchunk.

Para completar el código, así es como conservo 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);
    }
}
narko
fuente
2

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.

Antonio Figueiredo Tamura
fuente
1

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:

$parent->uuid

Espero que ayude.

Mark Löwe
fuente
0

Tuve el mismo error, el problema era que estaba intentando agregar elementos role_idexternos a la userstabla, pero role_idno 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 usar migrate:fresh, pero si estuviera en producción, probablemente establecería un valor predeterminado en role_idy no lo haría no restringido hasta que tuviera el rol correspondiente en la base de datos.

Artur Junior
fuente