# UPDATE - Befehl nur in einer Zeile



## FHWS (1. Jun 2018)

Hallo,

mit meiner erstellten Klasse möchte ich eine bestehende Tabelle in meiner Datenbank "Updaten".
Die Vorgehensweise soll so sein, dass die Zeile in welcher ein Boxinhalt "0" ist mit den neuen Daten gefüttert wird. Das Problem an der Sache ist, wenn ich die Daten an die Datenbank übergeben schreibt er mir die Werte in alle Zeilen rein in welcher der Boxinhalt "0" ist. Ich möchte allerdings, dass die Daten nur in eine Zeile mit dem Boxinhalt "0" gefüttert wird. Die anderen Zeilen mit Boxinhalt "0" sollen bei "0" bleiben. Hat jemand einen Tipp? Habe schon einiges ausprobiert und bin noch relativer Anfänger... Danke für Tipps!


```
ublic static String MariaDB;

 
    MariaDB() {
     
        try {
            Class.forName("org.mariadb.jdbc.Driver");    //Treiber für ODBC
            conn = DriverManager.getConnection("jdbc:mariadb://fm-s012mp.fhws.de","Java","");
            System.out.println("Erfolgreich verbunden. MDB"); 
            try {
                eintragen();
            }
            finally {
                conn.close();
            }
        }
        catch (Exception e){
            System.out.println("Keine Verbindung gefunden. MDB");
            System.err.println(e);
        } 
    }
 
    public void eintragen(){
     
        try {
            eintrag = conn.createStatement();
            eintrag.executeQuery ("UPDATE  `lagersystem_test`.`00_hauptdatenbank` SET Boxinhalt= '"+GUI_Lager.e3+"', Fahrgestell_Nr = '"+GUI_Lager.e1+"'  WHERE `Boxinhalt`='0' ");
         
        }
        catch (Exception e) {
            System.out.println(e);
        } 
    }
}
```


----------



## httpdigest (1. Jun 2018)

Was genau meinst du denn mit "dass die Daten nur in eine Zeile mit dem Boxinhalt "0" gefüttert wird". Woher soll denn die Datenbank wissen, welche Zeile du meinst?
Hast du, außer, dass der "Boxinhalt" = '0' sein soll, noch andere qualifizierende Merkmale, die du zwar weißt aber eben die Datenbank nicht?


----------



## FHWS (1. Jun 2018)

Ich habe in meiner Tabelle mehrere Zeilen welche alle den Boxinhalt 0 haben. In der Zeile selbst ist noch eine Fahrgestelnummer auch mit dem Wert 0 sowie eine festgelegte fortlaufende Nummer. Wenn ich nun meine neuen Daten als Update übergebe, soll nur eine Zeile mit den neuen Werte überschrieben werden. Und genau die Bedienung das eben nur eine Zeile (welche ist egal) mit Boxinhalt 0 die neuen Daten bekommt fehlt mir.

Kann man das Problem nicht über einen ROWCOUNT lösen? Wüsste allerdings nicht wie ich den richtig anwenden soll.


----------



## Thallius (1. Jun 2018)

Wozu sind denn die leeren Zeilen da? Lass die weg und erzeuge immer eine neue. Für die fortlaufende Nummer gibt es autoincrement Felder.


----------



## httpdigest (1. Jun 2018)

Mit Google und StackOverflow bekommst du im allgemeinen gute Antworten auf solche Fragen. Hat mich 10 Sekunden gekostet, folgendes mit Google zu recherchieren per "<database> update only one row":

SQL Server: https://stackoverflow.com/questions...date-only-one-row-in-database#answer-26929469

Oracle: https://stackoverflow.com/questions...y-one-row-without-using-rowid#answer-37318222

Alle (wenn du einen Primärschlüssel, bzw. eindeutigen Schlüssel hast): https://stackoverflow.com/questions/21258250/sql-how-to-update-only-first-row#answer-21258303


----------



## FHWS (2. Jun 2018)

Die Tabelle hat eine eine definierte Anzahl von Boxen welche eine Nummer zugewiesen bekommen haben Box1 Box2 usw. Die Box-Nummern stellen auch meinen Primärschlüssel dar. Die Zeilen mit den jeweiligen Box-Nummern sind also fix, die sollen in der Tabelle bleiben. Somit sehe ich welche Boxen belegt sind und welche eben frei sind.

@httpdigest meinst du ich hab nicht vorher mal gegoogelt und das Zeugs ausprobiert??Funktioniert leider nicht. Bzw. vll habe ich es auch nicht richtig eingepflegt.


----------



## httpdigest (2. Jun 2018)

Also, mal zusammengefasst: Aufgrund der bis jetzt von dir veröffentlichten Informationen, sieht deine Tabelle mindestens mal so aus:

```
Boxnummer | Boxinhalt | Fahrgestellnummer | Weitere Spalten...
--------------------------------------------------------------
    1     |    '0'    |     '01'          |
    2     |    '0'    |     '02'          |
    3     |    '0'    |     '03'          |
    4     |    '1'    |     '04'          |
    5     |    '1'    |     '05'          |
    6     |    '0'    |     '06'          |
```
Und jetzt möchtest du, dass "irgendeine" Zeile mit Boxinhalt '0' per UPDATE Statement aktualisiert wird?
Also:

```
UPDATE Table SET WeitereSpalte='irgendwas'
WHERE Boxnummer = (SELECT Boxnummer FROM Table WHERE Boxinhalt='0' LIMIT 1)
```
?


----------



## FHWS (2. Jun 2018)

Genau die Tabelle ist so richtig aufgebaut. Ich möchte mit dem Update Statement nun in irgendeine Box in der der Boxinhalt = 0 ist, den Boxinhalt und die Fahrgestellnummer aktualisieren. Aber eben nur in eine Zeile nicht in alle bei denen der Boxinhalt = 0 ist.

Habe es nun so probiert, jedoch scheint da noch irgendwo ein Fehler zu sein.


```
eintrag.executeQuery ("UPDATE  `lagersystem_test`.`00_hauptdatenbank` SET Boxinhalt= '"3"', Fahrgestell_Nr = '"003"' WHERE `Boxinhalt`='0' ORDER BY Boxinhalt LIMIT 1");
```


----------



## httpdigest (2. Jun 2018)

```
UPDATE  `lagersystem_test`.`00_hauptdatenbank` SET Boxinhalt= '"3"', Fahrgestell_Nr = '"003"' WHERE `Boxinhalt`='0' ORDER BY Boxinhalt LIMIT 1
```
und

```
UPDATE Table SET WeitereSpalte='irgendwas'
WHERE Boxnummer = (SELECT Boxnummer FROM Table WHERE Boxinhalt='0' LIMIT 1)
```
sind ja auch fundamental unterschiedlich.

Du kannst kein LIMIT an ein UPDATE Statement packen. Verwende einfach bitte das UPDATE Statement aus dem Stackoverflow Eintrag. Du hast es leider komplett verändert und den Subselect herausgenommen.


----------



## Thallius (2. Jun 2018)

Das ganze macht konzeptionell trotzdem überhaupt keinen Sinn. Man vorverfüllt keine Datenbank mit Invaliden Datensätzen und füllt sie dann mehr oder weniger zufällig. Wenn eine Box leer ist, dann st sie nicht In der Datenbank. Wenn du etwas in die Box tust, dann legst du die Box in der Datenbank an. Wenn du eine maximale Anzahl an Boxen nicht überschreiten willst, dann muss das der Client regeln.


----------



## FHWS (4. Jun 2018)

@Thallius was Sinn macht und was keinen Sinn macht entscheidet immer noch derjenige der etwas plant zu machen. Da du den Hintergrund der ganzen Sache nicht kennst macht es für dich auch keinen Sinn.  Danke für deine hilfreichen und kreativen Beitrag, braucht kein Mensch.

@httpdigest Vielen Dank für deine Ratschläge und deine Zeit hat jetzt so funktioniert. Stand bei der Sache etwas aufm Schlauch...  Danke!


----------



## Thallius (4. Jun 2018)

FHWS hat gesagt.:


> @Thallius was Sinn macht und was keinen Sinn macht entscheidet immer noch derjenige der etwas plant zu machen. Da du den Hintergrund der ganzen Sache nicht kennst macht es für dich auch keinen Sinn.  Danke für deine hilfreichen und kreativen Beitrag, braucht kein Mensch.



Blöd nur wenn der Planer absolut keine Ahnung hat, wie es hier der Fall zu sein scheint. Aber es ist eben nicht jedem zu helfen...


----------

