web-dev-qa-db-fra.com

Laravel - ajouter une clé étrangère sur une table existante avec des données

J'ai une table existante objects avec des données. Maintenant, je dois ajouter une nouvelle table nommée holdings et ajouter une relation d'objets à la table holdings. Dans le fichier de migration, j'imprime ceci:

$table->foreign('holding_id')->references('id')->on('holdings')->onDelete("NO ACTION");

et obtenez cette erreur en essayant de migrer 

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update 
a child row: a foreign key constraint fails (`kolomnaoffice`.`#sql-f10_126` 
CONSTRAINT `objects_holding_id_foreign` FOREIGN KEY (`holding_id`) 
REFERENCES `holdings` (`id`) ON DELETE NO ACTION) (SQL: alter table `objects` add constraint 
`objects_holding_id_foreign` foreign key (`holding_id`) references `holdings` 
(`id`) on delete NO ACTION)

J'ai la structure de base de données correcte (InnoDB), les champs existent et ont le type correct (int). La seule différence est que la table objects est remplie de données et que la table holdings est nouvelle et vide.

5
Alexander Guskov

La colonne holding_id devrait être unsigned

Créez un nouveau fichier de migration et migrez-le, le code de migration devrait ressembler à ceci:

Schema::table('objects', function (Blueprint $table) {
    $table->integer('holding_id')->unsigned()->change();

    $table->foreign('holding_id')->references('id')->on('holdings');
});

La méthode change() est appelée pour modifier la structure de la colonne existante.

Il n'est pas nécessaire d'appeler la méthode onDelete("NO ACTION").

6
Mohammad b

Merci Mohammad, mais cette solution n'a pas fonctionné pour moi car je suis Laravel 5.4 et j'ai un cas différent. Mon autre table existe déjà. Voici ce que j'ai trouvé, cela peut-il aider quelqu'un.

Schema::table('objects', function (Blueprint $table) {
    $table->integer('holding_id')->unsigned()->index()->nullable();

    $table->foreign('holding_id')->references('id')->on('holdings');
});

avec index() et nullable() cela a fait l'affaire.

Éditer Pas besoin de index() il suffit juste d'être nullable()

2
Yousef Altaf

Pour ajouter une clé étrangère, assurez-vous d'abord que votre colonne est marquée comme non signée. 

Ajoutez juste une ligne avant votre ligne:

$table->integer('holding_id')->unsigned();
$table->foreign('holding_id')->references('id')->on('holdings')->onDelete("NO ACTION");
0
ajit