Ich versuche, Werte in meine Kommentartabelle einzufügen, und es wird eine Fehlermeldung angezeigt. Es heißt, dass ich keine untergeordnete Zeile hinzufügen oder aktualisieren kann und keine Ahnung habe, was das bedeutet.
Mein Schema sieht ungefähr so aus
-- ----------------------------
-- 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');
und die MySQL-Anweisung, die ich versuche, sieht ungefähr so aus
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')
Der Fehler, den ich bekomme, sieht so aus
SQLSTATE [23000]: Verletzung der Integritätsbedingung: 1452 Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl (
anthonyl_fbpj
.comments
, CONSTRAINTfk_comments_projects1
FOREIGN KEY (project_id
) REFERENCESprojects
(id
) ON DELETE NO ACTION ON UPDATE NO ACTION)
Stellen Sie sicher, dass Sie
project_id
in derfillable
Eigenschaft IhresComment
Modells haben.Ich hatte das gleiche Problem, und das war der Grund.
quelle
Stellen Sie außerdem sicher, dass der von Ihnen hinzugefügte Fremdschlüssel vom selben Typ wie die ursprüngliche Spalte ist. Wenn die Spalte, auf die Sie verweisen, nicht vom selben Typ ist, schlägt sie ebenfalls fehl.
quelle
Wenn Sie einer vorhandenen Tabelle einen neuen Fremdschlüssel hinzufügen und die Spalten nicht null und kein Standardwert zugewiesen sind, wird folgende Fehlermeldung angezeigt:
Entweder müssen Sie es machen
nullable
oderassign default value
, oderdelete all the existing records
es lösen.quelle
Löschen Sie zuerst die Einschränkung "fk_comments_projects1" und auch deren Index. Danach erstellen Sie es neu.
quelle
das bedeutet , dass der Wert für die Spalte
project_id
auf dem Tischcomments
nicht nur einfügen ,doesn't exist
auf dem Tisch Projekte ABER auchproject_id
wahrscheinlich nicht Standardwert hat . In meinem Fall habe ich es beispielsweise auf NULL gesetzt.Was Laravel betrifft, können Sie diese Ausdrücke als Codeabschnitt einer Migrations-PHP-Datei betrachten, zum Beispiel:
{ /** * Run the migrations. * * @return void */
}
Natürlich mussten Sie die Modellklasse (in meinem Fall Foto) neben all diesen erstellen.
quelle
Ich hoffe meine Entscheidung wird helfen. Ich hatte einen ähnlichen Fehler in Laravel. Ich habe der falschen Tabelle einen Fremdschlüssel hinzugefügt.
Falscher Code:
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'); ... });
Bitte beachten Sie die Funktion unter ('Kommentare') oben. Richtiger Code
quelle
Diese Fehlermeldung wird auch angezeigt, wenn Sie Ihre Tabellen nicht in der richtigen Reihenfolge erstellen und füllen. Zum Beispiel nach Ihrem Schema, Kommentare Tabelle Bedürfnissen
user_id
,project_id
,task_id
unddata_type_id
. Dies bedeutet, dassUsers
Tabelle,Projects
Tabelle,Task
Tabelle undData_Type
Tabelle bereits beendet sein müssen und Werte enthalten müssen, bevor Sie auf ihre IDs oder eine andere Spalte verweisen können.In Laravel würde dies bedeuten, dass Sie Ihre Datenbank-Seeders in der richtigen Reihenfolge aufrufen:
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); } }
So habe ich ein ähnliches Problem gelöst.
quelle
Für den Fall, dass jemand Laravel verwendet und dieses Problem bekommt. Ich bekam dies auch und das Problem war in der Reihenfolge, in der ich die IDs (dh die Fremdschlüssel) in die Pivot-Tabelle einfügte.
Um konkret zu sein, finden Sie unten ein Beispiel für eine Beziehung von vielen zu vielen:
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'); });
Jetzt sehen meine Modelle wie folgt aus:
Ich habe das Problem behoben, indem ich die Reihenfolge von 'wordchunk_id' und 'wordtoken_id' im Wordchunk-Modell ausgetauscht habe.
Für die Code-Vervollständigung behalte ich die Modelle folgendermaßen bei:
quelle
Vielleicht haben Sie einige Zeilen in der Tabelle, die Sie de FK erstellen möchten.
Führen Sie die Migration mit Foreign_key_checks OFF aus. Fügen Sie nur die Datensätze mit dem entsprechenden ID-Feld in das Inhaltsverzeichnis ein.
quelle
Ich hatte dieses Problem, als ich versehentlich die falsche "UUID" in meiner Kinderakte verwendete. In diesem Fall sucht die Einschränkung vom untergeordneten zum übergeordneten Datensatz, um sicherzustellen, dass die Verknüpfung korrekt ist. Ich habe es manuell generiert, als ich mein Modell bereits so manipuliert hatte, dass es automatisch ausgeführt wird. Mein Fix war also:
$parent = Parent:create($recData); // asssigning autogenerated uuid into $parent
Als ich dann meine Kinderklasse anrief, um Kinder einzufügen, übergab ich diesen var-Wert:
Hoffentlich hilft das.
quelle
Ich hatte den gleichen Fehler. Das Problem war, dass ich versuchte,
role_id
derusers
Tabelle Fremdwerte hinzuzufügen , aberrole_id
keinen Standardwert hatte. Daher erlaubte mir die Datenbank nicht, die Spalte einzufügen, da ich bereits einige Benutzer hatte und dies nicht der Fall war wissen, wie man die Spalte zu ihnen hinzufügt. Da ich in der Entwicklung war, habe ich nur verwendetmigrate:fresh
, aber wenn ich in der Produktion war, würde ich wahrscheinlich einen Standardwert auf festlegenrole_id
und ihn nicht einschränken, bis ich die entsprechende Rolle in der Datenbank hatte.quelle