Hello,
Hast du eine bessere Idee wie ich das aufbauen könnte?
Eine bessere nicht. Denn sie Geschäftsregeln der Datenhaltung sollten schon im DBMS verankert werden, damit man sie nicht umgehen kann.
Eine andere schon:
Du kannst die Abarbeitung auch in der API, also mittels PHP lösen.
#Pseudocode:
Schleife bis Erfolg oder Ende
Datensatz auslesen mit `select`
case Feld1 leer
updateversuch `where id=$id and feld1 == leer`
affected Rows == 1 -> Erfolg
break
case Feld2 leer
updateversuch `where id=$id and feld2 == leer`
affected Rows == 1 -> Erfolg
break
...
case FeldX leer
updateversuch `where id=$id and feldX == leer`
affected Rows == 1 -> Erfolg
-> Ende
(break)
— Schleifenende —
wenn nicht Erfolg
insert
So wird immer nur ein Updateversuch auf das erste leere Feld vorgenommen. Wenn dieses aber zwischen dem Select und dem Versuch schon von einem anderen Prozess belegt wurde, wird die Schleife nochmals durchlaufen. Das geschieht im Zweifeldfall sooft, bis auch das letzte relevante Feld geprüft wurde. Scheitert das Update dort auch nochmal, wird ein Insert vorgenommen.
Das schützt Dich aber nicht davor, dass Du nachher lauter Datensätze mit nur einem belegten Feld hast. Das müsstest Du noch extra abfangen.
Besser wäre es daher, Du würdest normalisieren und dir eine Tabelle aufbauen, die pro Kopfdatensatz N Positionsdatensätze (die ehemaligen Felder) erhalten kann. Die Anzahl der Positionsdatensätze kannst Du mittels Subselect vorher abfragen.
Liebe Grüße
Tom S.
Es gibt nichts Gutes, außer man tut es
Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.