Verletzung der Integritätsbeschränkung: 1452 Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden:

84

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

numerisch25
quelle

Antworten:

123

Dies bedeutet lediglich, dass der Wert für die Spalte project_idin der Tabelle, die commentsSie einfügen, in der Tabelle nicht vorhanden ist projects. Beachten Sie, dass die Werte der Spalte project_idin der Tabelle commentsvon den Werten der IDTabelle abhängen Projects.

Der Wert, den 50dc845a-83e4-4db3-8705-5432ae7aaee3Sie für die Spalte einfügen project_id, ist in der Tabelle nicht vorhanden projects.

John Woo
quelle
25
Was ist, wenn ich Wert in dieser Tabelle habe? Ich habe den gleichen Fehler, aber die Werte in Tabelle und ID stimmen überein.
Sergey Romanov
4
Ich hatte ein ähnliches Problem. Das Löschen der alten Daten aus der Tabelle löste das Problem in meinem Fall.
Yojan
2
Yojan, welche Tabelle sollen wir löschen, die "Eltern" oder die "Kinder" (abhängige)?
Erdnüsse
46

Stellen Sie sicher, dass Sie project_idin der fillableEigenschaft Ihres CommentModells haben.

Ich hatte das gleiche Problem, und das war der Grund.

Jyothu
quelle
8
Gleiches hier mit Laravel. Schöner Fang.
PapaHotelPapa
8

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
5

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 nullableoder assign default value, oder delete all the existing recordses lösen.

Prafulla Kumar Sahu
quelle
4

Löschen Sie zuerst die Einschränkung "fk_comments_projects1" und auch deren Index. Danach erstellen Sie es neu.

Sreerag AS
quelle
4

das bedeutet , dass der Wert für die Spalte project_idauf dem Tisch commentsnicht nur einfügen , doesn't existauf dem Tisch Projekte ABER auch project_idwahrscheinlich 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:

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

}

Natürlich mussten Sie die Modellklasse (in meinem Fall Foto) neben all diesen erstellen.

CodeToLife
quelle
3

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

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

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_idund data_type_id. Dies bedeutet, dass UsersTabelle, ProjectsTabelle, TaskTabelle und Data_TypeTabelle 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.

KC Samm
quelle
2

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:

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

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:

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
quelle
2

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.

Antonio Figueiredo Tamura
quelle
1

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:

$parent->uuid

Hoffentlich hilft das.

Mark Löwe
quelle
0

Ich hatte den gleichen Fehler. Das Problem war, dass ich versuchte, role_idder usersTabelle Fremdwerte hinzuzufügen , aber role_idkeinen 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 verwendet migrate:fresh, aber wenn ich in der Produktion war, würde ich wahrscheinlich einen Standardwert auf festlegen role_idund ihn nicht einschränken, bis ich die entsprechende Rolle in der Datenbank hatte.

Artur Junior
quelle