Rolf b: Mysql SET update

Beitrag lesen

Ein Set ist in MYSQL DB-Column eine maximal 64-bittige Bitmap, und die Werte, die Du im Set speichern kannst, werden bei der Tabellendeklaration festgelegt. FIND_IN_SET ist eigentlich dafür gedacht.

Allerdings könntest Du mit einer SET Column dein liste2-Feld nicht repräsentieren, da ein Set nicht mehrmals den gleichen Wert aufnehmen kann. Deine Datenbank wird also keine SET Columns enthalten, sondern Strings. Was Du damit hast, sind zwei Columns, die jeweils ein serialisiertes Array sind.

Eine Column mit strukturiertem Inhalt oder eine Wiederholungsgruppe von Columns sind etwas, was in einer relationalen DB nichts zu suchen hat. Den Grund dafür hast Du beim Stellen deiner Frage bemerkt: SQL ist dafür nicht gemacht. Bitte lies Dich in die Normalformen von Relationen ein - dein Konstrukt verletzt die erste Normalform.

Wie macht man es besser?

Vermutlich hat deine Tabelle eine identifizierende Spalte (ID-Nummer oder ein Name), liste1, liste2 und noch ein paar Spalten mehr.

Ziehe liste1 und liste2 aus der Tabelle heraus und mach daraus eine neue Tabelle, mit den 3 Spalten

  • ID (oder was auch immer Du in der Haupt-tabelle zum eindeutigen Identifizieren von Rows verwendest)
  • Buchstabe CHAR(1)
  • Anzahl INT (oder TINYINT wenn du weißt dass es nicht viele werden)

Als Primary Key dieser set_tabelle nimmst Du ID und Buchstabe.

Nun hast Du zwar andere Aufgaben zu lösen (z.B. Unterscheiden zwischen INSERT und UPDATE), aber das sind Aufgaben die in die Domäne einer Datenbank gehören.

Wenn Du nun für mehrere IDs das Set um ein 'f' erweitern willst, machst Du das mit MYSQL in etwa so:

INSERT INTO set_tabelle (id, buchstabe, anzahl)
SELECT ID, 'f', 1 FROM haupt_tabelle WHERE (bedingung für die gewünschten sätze)
ON DUPLICATE KEY SET anzahl=anzahl+1

Ohne die ON DUPLICATE KEY Klausel wäre es deutlich mühsamer, das ist ein nettes Gimmick in MySQL. In MS SQL gibt's noch den MERGE-Befehl, der ist aber deutlich schwergewichtiger.

Natürlich belegt deine DB jetzt deutlich mehr Platz. Aber dafür operierst Du darauf nun auch ohne gebrochene Finger und vermutlich auch deutlich fixer.

Rolf