Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

UPDATE in die einzige leere Zeile

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von alexfrenzel92, 20 Juni 2016.

  1. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Wie kann ich in einer Tabelle mit 7 Spalten, die Zeile updaten, bei der in Spalte1 (unique) der Wert X steht bzw. eine einzige freie Zelle (der Spalten 2-7) dieser Spalte (falls eine freie Zelle mit dem Wert NULL) vorhanden ist, mit einem bestimmten Wert updaten?

    Das Ergebnis wäre eine unveränderte Zeile, nur dass ein NULL-Wert durch einen bestimmten anderen Wert ersetzt wird.

    mfg danke
    Alex
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Idealerweise hat jede Tabelle einen Primary Key, aber generell geht die Auswahl der upzudatenden Zeile via der WHERE-Condition.
     
  3. ukulele

    ukulele Datenbank-Guru

    Code:
    UPDATE tabelle SET spalte1 = 'asdf' WHERE spalte1 = 'X'
    
    UPDATE tabelle SET spalte2 = 'asdf' WHERE spalte2 IS NULL
    
    UPDATE tabelle SET spalte3 = 'asdf' WHERE spalte3 IS NULL
    
    [...]
     
  4. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Demnach würden falls beide Spalten NULL sind, beide aufgefüllt. Wenn mehrere Spalten NULL sind, soll der erste Wert geupdated werden aber der zweite nicht.
    Gibt es nicht irgendwas mit IF oder CASE WHEN, sodass man überprüfen kann, ob eine Spalte NULL ist und per ELSE (falls die erste Spalte nicht NULL ist) die nächste Spalte auf NULL überprüft werden kann?

    Besser formuliert wäre die Frage vll gewesen, wie IF ELSE in SQL funktioniert.

    Gegoogelt würde das nach dem Schema
    Code:
    IF((SELECT COUNT(*)FROM table1 WHERE project =1)>0)
    SELECT product, price FROM table1 WHERE project =1
    ELSEIF((SELECT COUNT(*)FROM table1 WHERE project =2)>0)
    SELECT product, price FROM table1 WHERE project =2
    ELSEIF((SELECT COUNT(*)FROM table1 WHERE project =3)>0)
    SELECT product, price FROM table1 WHERE project =3
    funktionieren

    Hierfür bekomme ich (das jeweils zweite SELECT durch UPDATE ersetzt und ">0" durch alle möglichen ISNULL-Variationen ersetzt): #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '...' at line 1
     
  5. ukulele

    ukulele Datenbank-Guru

    Hm also dein Statement arbeitet ja nicht Zeilenbasiert, das kann eigentlich keinen Sinn machen. Du solltest vielleicht mit CASE arbeiten, das kann allerdings umfangreich werden.
    Code:
    UPDATE tabelle
    SET spalte1 = (CASE WHEN spalte1 = 'X' OR spalte2 IS NULL AND (spalte3 IS NULL OR spalte4 IS NULL OR spalte5 IS NULL OR spalte6 IS NULL OR spalte7 IS NULL) THEN 'X' ELSE spalte1 END),
    spalte2 = (CASE WHEN spalte2 IS NULL AND (spalte3 IS NULL OR spalte4 IS NULL OR spalte5 IS NULL OR spalte6 IS NULL OR spalte7 IS NULL) THEN 'asdf' ELSE spalte2 END)
    ...
    
    Ich verstehe allerdings die Logik wann welche Spalte NULL ist und wann was gesetzt werden soll nicht. Hört sich auch irgendwie kaputt an.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Das klingt nach einem kapotten Design. Offenbar haben die N Spalten dieselbe Bedeutung und sollen nacheinander befüllt werden, als z.B. eine Art Log.
     
  7. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Die Logik dahinter ist eigentlich nicht schwer zu verstehen.

    Es gibt drei relevante Spalten. Wenn mindestens eine davon NULL ist, soll genau eine geupdatet werden. Falls zusätzlich andere Spalten NULL sind, die NULL sind, soll nichts passieren. Wenn keine NULL ist, soll nichts passieren.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Du könntest diese Logik in einem TRIGGER abbilden. Vermutlich der einfachste Weg, da in einer Triggerfunktion Du deutlich mehr sprachliche Werkzeuge hast als SQL nativ Dir bietet.
     
  9. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Aber es gibt doch auch IF ELSE Funktionen in SQL oder?
     
  10. akretschmer

    akretschmer Datenbank-Guru

    case when ...
     
  11. ukulele

    ukulele Datenbank-Guru

    Wie schon gesagt entweder wie oben mit CASE oder in einzelnen Statements, ist vermutlich übersichtlicher:
    Code:
    UPDATE tabelle
    SET spalte1 = 'asdf'
    WHERE spalte1 IS NULL
    AND ( spalte2 IS NULL OR spalte3 IS NULL )
    
    UPDATE tabelle
    SET spalte2 = 'asdf'
    WHERE spalte2 IS NULL
    AND ( spalte1 IS NULL OR spalte3 IS NULL )
    usw.

    Ist einfach viel Code aber simpel.
     
  12. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Also die Methode/Idee von @ukelele gefällt mir momentan ganz gut.
    Wenn man IS NOT NULL einbindet sind es nur drei Abfragen und gar nicht so viel Code.

    Kann man die irgendwie in einer Abfrage verbinden?

    Wie bei UNION ALL oder mit einem Komma oder so? Dann bliebe es bei einer statt drei Abfragen.
     
  13. ukulele

    ukulele Datenbank-Guru

    UNION ALL oder Komma dienen anderen Zwecken. Der einzige Weg wäre, ein UPDATE zu machen und dann das, was in die Zeilen geschrieben werden soll mit CASE zu bestimmen (siehe Post #5). Das wird aber unübersichtlicher, mehr Code, es wird mehr an der Tabelle aktualisiert und schneller dürfte es auch nicht sein. Es spricht aber aus meiner Sicht nicht viel dagegen alles in drei Schritten zu machen.
     
  14. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Dann wird denke ich auch das die beste Möglichkeit sein udn so werd ichs auch machen. hätte ja sein können also danke für die idee
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden