2017-02-14 3 views
0

ich eine Variable in $ _POST haben, die wie folgt aussieht:Mit Verknüpfungstabelle mit doppelten IDs confusiont mit einer SQL-Abfrage in einem PHP foreach-Schleife verursacht

[genre_id] => Array 
    (
     [0] => 1 
     [1] => 3 
    ) 

Ich habe einen Block von PHP-Code wie folgt aus:

Die Tabelle mit der Bezeichnung books_genres ist eine Junction-Tabelle wegen einer Beziehung von vielen zu vielen. Dies bedeutet, dass einige der $book_id dupliziert werden. Offensichtlich wird jede Zeile mit der angegebenen Nummer book_id jedes Mal aktualisiert.
Sollte ich eine andere Spalte in meiner Tabelle books_genres haben? Selbst dann bin ich mir nicht sicher, wie ich diesen Index referenzieren würde? Oder sollte ich die Abfrage irgendwie anders schreiben?

+0

Normalerweise aktualisieren Sie keine Junction-Tabelle. Sie würden die alten Werte entfernen und neue einfügen. Wenn Sie diese Art von Aktualisierung durchführen möchten, müssen Sie die "alte" genre_id als zusätzliches Prädikat in Ihre where-Klausel aufnehmen, damit sie weiß, welche genre_id Sie aktualisieren möchten. –

+0

@sean_lange, also würde ich sowohl die Bücher und Genres Tabellen jeweils aktualisieren dann Code, der die Tabelle books_genres separat aktualisiert? Verstehe ich, was Sie sagen, ist mehr Standard? –

+0

Nein. Der Punkt einer Junction-Tabelle ist, dass Sie nie etwas aktualisieren müssen. Es hat den Schlüssel von beiden Tabellen richtig? Der Schlüssel ändert sich nicht in Ihrer Tabelle, oder? Wenn Sie Ihre Strukturen nicht denormalisiert haben, müssen Sie die Junction-Tabellen nur in sehr seltenen Fällen aktualisieren. Wenn ein bestimmtes Buch als "klassisch" klassifiziert wurde und dann als "Horror" klassifiziert wird, würden Sie den klassischen Eintrag löschen und den Horror-Eintrag einfügen. Vielleicht würde die Veröffentlichung des ddl und einiger Beispieldaten dazu beitragen, dies zu erklären. –

Antwort

0

Der Punkt einer Junction-Tabelle ist, dass Sie nichts jemals aktualisieren müssen. Es hat den Schlüssel von beiden Tabellen richtig? Der Schlüssel ändert sich nicht in Ihrer Tabelle, oder? Wenn Sie Ihre Strukturen nicht denormalisiert haben, müssen Sie die Junction-Tabellen nur in sehr seltenen Fällen aktualisieren. Wenn ein bestimmtes Buch als "klassisch" klassifiziert wurde und dann als "Horror" klassifiziert wird, würden Sie den klassischen Eintrag löschen und den Horror-Eintrag einfügen. Vielleicht würde die Veröffentlichung des ddl und einiger Beispieldaten dazu beitragen, dies zu erklären.

0

Offensichtlich wird jede Zeile mit der angegebenen book_id jedes Mal aktualisiert.

Aber genau das haben Sie von MySQL Engine verlangt!

Bitte denken Sie daran, das SQL ist eine deklarative Sprache, nicht zwingend erforderlich. Also anstatt den Code anzuzeigen, deklarieren Sie Sie Absichten!

Sagen Sie sich und uns, was Sie aktualisieren möchten.

Mit anderen Worten, definieren Sie einen Datensatz die "Aktualisierung" sollte getroffen werden. Damit können Sie leicht die "where" -Klausel ableiten, die Sie benötigen, um die Operation einzuschränken.

Verwandte Themen