Schreiben von zu vielen Einträgen in einer Datenbank

Burned

Mitglied
Hallo zusammen,

ich habe folgendes Problem: Ich will eine feste Anzahl von Zeilen in einer SQLite DB ändern. Die Anzahl wird zufällig, anhand eines Prozentsatzes ausgewählt. Ich habe das Ganze soweit, dass alles funktioniert, außer dass die Anzahl an geschriebenen Werten in der Datenbank zu hoch ist. Hier zuerst der Code, danach gebe ich euch ein Beispiel.

"vonBis" ist dabei ein String, der mitgegeben wird, zum Beispiel: "66 AND 70".
"wahrM" bzw. "wahrW" ist die Wahrscheinlichkeit, mit der die einzelnen Zeilen auf 3 gesetzt werden sollen, bei der Altersklasse zwischen 66 und 70 sind das für Männer 5%, für Frauen 20%.
"count" gibt die Anzahl von Reihen mit bestimmten Eigenschaften als int zurück (s.u.).
"blankUpdate" updated die DB (s.u.).

Java:
public static void verwitwetStmt(String vonBis, int wahrM, int wahrW) {
        String select;
        String preparedStmt;
        Random r = new Random();
        int rnd;
        int countW = 0;
        int countM = 0;
        // Zählen aller Männer in einem bestimmten Alter.
        int anzahl = DBUpdater.count("Jahre", "Jahre BETWEEN " + vonBis + " AND Geschlecht IS 0");

        // Verteilen des "verwitwet" Zustand gemäß der Wahrscheinlichkeit in der jeweiligen Altersgruppe.
        for (int i = 0; i < anzahl; i++) {
            rnd = r.nextInt(100);
            if (rnd <= wahrM)
                countM++;
            }
        System.out.println(anzahl + ", " +countM);
      
        // Statement für die Veränderung in der DB
        select = "SELECT ID FROM individuen WHERE Jahre BETWEEN " + vonBis + " AND Familienstand IS NULL "
                + "AND Geschlecht IS 0 ORDER BY RANDOM() LIMIT " + Integer.toString(countM) + ";";
        preparedStmt = "UPDATE individuen SET Familienstand = ? WHERE ID = ?";

        DBUpdater.blankUpdate(select, preparedStmt, 3);
      
        anzahl = DBUpdater.count("Jahre", "Jahre BETWEEN " + vonBis + " AND Geschlecht IS 1");
      
        for (int i = 0; i < anzahl; i++) {
            rnd = r.nextInt(100);
            if (rnd <= wahrW)
                countW++;
            }
      
        System.out.println(wahrW);
      
        select = "SELECT ID FROM individuen WHERE Jahre BETWEEN " + vonBis + " AND Familienstand IS NULL "
                + "AND Geschlecht IS 1 ORDER BY RANDOM() LIMIT " + Integer.toString(countW) + ";";
        preparedStmt = "UPDATE individuen SET Familienstand = ? WHERE ID = ?";

        DBUpdater.blankUpdate(select, preparedStmt, 3);
    }

Hier die "count" Methode:
Java:
ublic static int count(String spalte, String whereStmt) {
        DBController dbc = DBController.getInstance();
        dbc.initDBConnection();
        int anzahl = 0;
        try {
            Statement stmt = DBController.connection.createStatement();
            String select = "SELECT COUNT(" + spalte + ") FROM individuen WHERE " + whereStmt + ";";
            ResultSet rs = stmt.executeQuery(select);

            select = rs.getString(1);
            anzahl = Integer.parseInt(select);
            rs.close();
            stmt.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return anzahl;
    }

Und hier die "blankUpdate" Methode:
Java:
public static void blankUpdate(String selectQuery, String preparedStatement, int wert) {
        DBController dbc = DBController.getInstance();
        dbc.initDBConnection();
        try {
            Statement stmt = DBController.connection.createStatement();
            ResultSet rs = stmt.executeQuery(selectQuery);
            PreparedStatement ps = DBController.connection.prepareStatement(preparedStatement);

            while (rs.next()) {
                ps.setInt(1, wert);
                ps.setInt(2, rs.getInt(1));
                ps.addBatch();
            }
            DBController.connection.setAutoCommit(false);
            ps.executeBatch();
            DBController.connection.setAutoCommit(true);
            ps.close();
            stmt.close();
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

Als Beispiel:
Anzahl von männlichen Personen zwischen 66 und 70: 2105
Prozent, die davon geschrieben werden sollen: 5%
CountM nach der for-Schleife: 130
Nach ausführen des Codes liefert nachfolgende SELECT-Abfrage in der DB 935 Zeilen zurück.

Code:
SELECT Familienstand FROM individuen WHERE Familienstand IS 3 AND Geschlecht is 0 and Jahre between 66 and 70

Weiß jemand, woran die Differenz liegen könnte? Ist was an meinen DB-Anfragen falsch? Ich finde meinen Fehler einfach nicht..
 
Zuletzt bearbeitet:

Burned

Mitglied
Falls du den Unterschied bei count und dem Update-Statement meinst, dann ist das Absicht. Count soll mir alle Frauen bzw. Männer in einer bestimmten Altersklasse zurückgeben. Geupdated werden sollen aber nur die, bei denen der Familienstand noch nicht geschrieben wurde.
 

Thallius

Top Contributor
Ich verstehe deinen code nicht so richtig.

Du hast 2105 Personen die in dem Bereich liegen der geändert werden soll. Davon sollen 5% geändert werden. Diese dann aber zufällig. Wozu ist denn nun die Schleife die den mCount erzeugt? Du kannst die Anzahl zu ändernden Personen doch einfach durch Prozentrechnung ermitteln. Anzahl = (2105 * 5) / 100;

Dann kannst du den ganzen Update in einem query machen

Code:
UPDATE individuen SET Familienstand = 3 
WHERE ID in (SELECT ID FROM (SELECT ID FROM individuen WHERE Jahre BETWEEN "+ vonBis +" AND Familienstand IS NULL "
               +"AND Geschlecht IS 1 ORDER BY RANDOM() LIMIT "+Anzahl+") as individuenalias)";

Der doppelte Select muss sein, da mysql kein select auf die gleiche Tabelle erlaubt in die auch geupdated wird.

Gruß

Claus
 

stg

Top Contributor
Du hast 2105 Personen die in dem Bereich liegen der geändert werden soll. Davon sollen 5% geändert werden. Diese dann aber zufällig. Wozu ist denn nun die Schleife die den mCount erzeugt? Du kannst die Anzahl zu ändernden Personen doch einfach durch Prozentrechnung ermitteln. Anzahl = (2105 * 5) / 100;

Vermutlich soll für jeden Eintrag selbst die Wahrscheinlichkeit, dass er geändert werden soll, bei 5% liegen und nicht einfach 5% der Werte geändert werden. Es ist also prinzipiell auch denkbar, dass gar kein Eintrag geändert wird. Das ist schon sinnvoll so und näher an der Realität :)
 

Burned

Mitglied
Vermutlich soll für jeden Eintrag selbst die Wahrscheinlichkeit, dass er geändert werden soll, bei 5% liegen und nicht einfach 5% der Werte geändert werden.

Genau deswegen. Danke stq ;)

Der doppelte Select muss sein, da mysql kein select auf die gleiche Tabelle erlaubt in die auch geupdated wird.

Das wusste ich nicht. Vielen Dank! Meine Lösung sieht jetzt so aus:

Java:
public static void verwitwetU65() {
        verwitwetStmt("66 AND 70", 5, 20);
        verwitwetStmt("71 AND 75", 10, 33);
        verwitwetStmt("76 AND 80", 14, 54);
        verwitwetStmt("81 AND 85", 25, 62);
        verwitwetStmt("86 AND 100", 37, 78);
    }
   
    public static void verwitwetStmt(String vonBis, int wahrM, int wahrW) {
        String select;
        String preparedStmt;
        Random r = new Random();
        int rnd;
        int countW = 0;
        int countM = 0;
        // Zählen aller Frauen in einem bestimmten Alter.
        int anzahl = DBUpdater.count("Jahre", "Jahre BETWEEN " + vonBis + " AND Geschlecht IS 0");

        // Verteilen des "verwitwet" Zustand gemäß der Wahrscheinlichkeit in der jeweiligen Altersgruppe.
        for (int i = 0; i < anzahl; i++) {
            rnd = r.nextInt(100);
            if (rnd <= wahrM)
                countM++;
        }
        System.out.println(anzahl + ", " +countM);
       
        DBController dbc = DBController.getInstance();
        dbc.initDBConnection();
       
        select = "UPDATE individuen SET Familienstand = 3 "
                + "WHERE ID in (SELECT ID FROM (SELECT ID FROM individuen WHERE Jahre BETWEEN "
                + vonBis +" AND Familienstand IS NULL AND Geschlecht IS 0 ORDER BY RANDOM() "
                        + "LIMIT "+countM+") as individuenalias);";
        try {
            Statement stmt = DBController.connection.createStatement();
            DBController.connection.setAutoCommit(false);
            stmt.executeUpdate(select);
            DBController.connection.setAutoCommit(true);
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        anzahl = DBUpdater.count("Jahre", "Jahre BETWEEN " + vonBis + " AND Geschlecht IS 1");
        for (int i = 0; i < anzahl; i++) {
            rnd = r.nextInt(100);
            if (rnd <= wahrW)
                countW++;
        }
        System.out.println(anzahl + ", " +countW);
       
        dbc = DBController.getInstance();
        dbc.initDBConnection();
       
        select = "UPDATE individuen SET Familienstand = 3 "
                + "WHERE ID in (SELECT ID FROM (SELECT ID FROM individuen WHERE Jahre BETWEEN "
                + vonBis +" AND Familienstand IS NULL AND Geschlecht IS 1 ORDER BY RANDOM() "
                        + "LIMIT "+countW+") as individuenalias);";
        try {
            Statement stmt = DBController.connection.createStatement();
            DBController.connection.setAutoCommit(false);
            stmt.executeUpdate(select);
            DBController.connection.setAutoCommit(true);
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

Vielen Dank für die Hilfe nochmal! Manchmal habe ich das Gefühl, ohne das Forum wäre ich vollkommen verloren..
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Gibt es einen anderen Weg um "{}" in IntelliJ zu schreiben? Java Basics - Anfänger-Themen 5
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
W Objekte einer ArrayList in txt-datei schreiben mit Paths? Java Basics - Anfänger-Themen 2
M Test auf Exceptions schreiben Java Basics - Anfänger-Themen 11
F Wie kann ich eine Funktion schreiben, die nur in bestimmten Fällen einen Wert zurückgibt? Java Basics - Anfänger-Themen 5
HolyFUT JSON String in Java Object schreiben - Anführungszeichen rauskriegen? Java Basics - Anfänger-Themen 17
java-starter Erste Schritte Mit While Schleifen Programme schreiben Java Basics - Anfänger-Themen 4
berserkerdq2 Wo ist der SInn, dass man den Stream, den ich zum Schreiben nutze, outputstream nenne? Java Basics - Anfänger-Themen 5
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
D JAVA Programm schreiben Java Basics - Anfänger-Themen 46
S In Datei schreiben in Java? Java Basics - Anfänger-Themen 1
J Dateien lesen und schreiben Java Basics - Anfänger-Themen 5
berserkerdq2 IO Streams logfile erstellen und Sachen schreiben wie? Java Basics - Anfänger-Themen 2
M Text in Datei schreiben Java Basics - Anfänger-Themen 9
berserkerdq2 Wie würde man einen regulären Ausdruck in Java schreiben, der prüft, dass zwei bestimtme Zahlen nicht nebeneinadner sind? Java Basics - Anfänger-Themen 3
S Bot schreiben Java Basics - Anfänger-Themen 1
J Kann ich mein Programm so schreiben? Java Basics - Anfänger-Themen 4
C Brauche Hilfe beim Schreiben eines Programmes :/ Java Basics - Anfänger-Themen 1
C Brauche Hilfe um ein Programm zu schreiben Java Basics - Anfänger-Themen 8
C XML Datei schreiben Java Basics - Anfänger-Themen 14
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
T Methode schreiben, die einem Array ein Stringelement hinzufügt, wenn dieses noch nicht enthalten ist. Java Basics - Anfänger-Themen 6
T Inhalt aus TextField in Attribut einer Instanz schreiben Java Basics - Anfänger-Themen 5
NeoLexx Datenströme Lesen und Schreiben einer Textdatei Java Basics - Anfänger-Themen 2
B Inputstream in file schreiben? Java Basics - Anfänger-Themen 23
L Test-Methoden schreiben Java Basics - Anfänger-Themen 13
L x und y Koordinaten in ein Array schreiben Java Basics - Anfänger-Themen 7
J Programm schreiben Java Basics - Anfänger-Themen 5
G In Datei schreiben Java Basics - Anfänger-Themen 1
B Werte aus einem Unterprogramm in ein Array schreiben Java Basics - Anfänger-Themen 2
J Methode zur Ausgabe eines Dreiecks aus Sternen schreiben? Java Basics - Anfänger-Themen 2
J Methode selber schreiben Java Basics - Anfänger-Themen 5
M Plateau Prgramm schreiben Java Basics - Anfänger-Themen 2
G Programm schreiben: Zahl (n) eingeben, 1+1/n+2/n+3/n+....+n/n Java Basics - Anfänger-Themen 8
J String in Datei schreiben Java Basics - Anfänger-Themen 4
L Kleine Hilfe beim Schreiben eines Programmes benötigt :D Java Basics - Anfänger-Themen 40
J Lesen und schreiben in eine Datei(Anfänger- Dateizugriffe) Java Basics - Anfänger-Themen 3
S JSON Datei schreiben und lesen Java Basics - Anfänger-Themen 3
W Einfachen, ein beliebiges Zeichen oft erkennenden Regex Parser selber schreiben - wie vorgehen? Java Basics - Anfänger-Themen 12
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
H projekt 1 code schöner schreiben. Java Basics - Anfänger-Themen 25
O findRoot Methode schreiben in einem Intervall Java Basics - Anfänger-Themen 31
O Erste Schritte Eigene charAt(i) Methode schreiben Java Basics - Anfänger-Themen 10
X Arrays untereinander schreiben Java Basics - Anfänger-Themen 4
K Probleme beim Programm schreiben - Lesen von Dateiinhalten -zaehlen von Wörtern/ Buchstaben Java Basics - Anfänger-Themen 4
A Erste Schritte Bitte helfen sie mir diese Programm zu schreiben Java Basics - Anfänger-Themen 12
L Input/Output Konsole in Farben schreiben Java Basics - Anfänger-Themen 4
P Strings in String Array schreiben Java Basics - Anfänger-Themen 13
Y kann jemand die Terme mit Zahlen schreiben ?? Java Basics - Anfänger-Themen 4
L Input/Output In Farben schreiben Java Basics - Anfänger-Themen 3
x-tshainge In gespeicherter Datei schreiben? Java Basics - Anfänger-Themen 7
F Schreibprogramm nur markierten Text in kursiv oder fett schreiben Java Basics - Anfänger-Themen 3
A JSON Lesen und Schreiben. Java Basics - Anfänger-Themen 3
L Eigene Exception schreiben bei zu langem Array Java Basics - Anfänger-Themen 10
karlmasutra Ausgabe in ein Array schreiben Java Basics - Anfänger-Themen 14
T Zufällige Matrix in neue Matrix schreiben Java Basics - Anfänger-Themen 6
F Mehrere Zeilen zu einer Zeile zusammenfügen und in eine Datei schreiben Java Basics - Anfänger-Themen 1
J Mit JSF Formular in Datenbank schreiben Java Basics - Anfänger-Themen 3
amazinglife77 Input/Output Lesen/Schreiben Properties: in eclipse geht, als JAR nicht Java Basics - Anfänger-Themen 4
S Wie muss ich die Generische Methode schreiben? Java Basics - Anfänger-Themen 6
R Input/Output Dateinamen aus Verzeichnis in Datei schreiben Java Basics - Anfänger-Themen 3
E Wert in Textfeld schreiben Java Basics - Anfänger-Themen 1
P Erste Schritte Schreiben in eine Datei Java Basics - Anfänger-Themen 9
M Java Roboter schreiben mit Eclipse Java Basics - Anfänger-Themen 3
J Probleme beim schreiben von Dateien Java Basics - Anfänger-Themen 5
M Rekursion schreiben Java Basics - Anfänger-Themen 16
M In einer Datei schreiben - Java Java Basics - Anfänger-Themen 3
D Eine einfache Verschlüsselung schreiben Java Basics - Anfänger-Themen 3
X Streams und Ausgabe - lässt sich das einfacher schreiben oder schöner schreiben? Java Basics - Anfänger-Themen 5
T Erste Schritte Schreiben Sie eine Klasse Zeit, die eine Zeitdauer in Minuten beschreibt. Die Anzahl Minuten verwalt Java Basics - Anfänger-Themen 3
G Java Objektorientiert schreiben Java Basics - Anfänger-Themen 1
D Daten mit Apache POI in eine Excel Datei schreiben Java Basics - Anfänger-Themen 5
N Lambda Ausdrücke richtig schreiben Java Basics - Anfänger-Themen 4
F Wert in Linux auf die Konsole schreiben Java Basics - Anfänger-Themen 3
A von ArrayList in Labels schreiben Java Basics - Anfänger-Themen 19
X Kann man post increment "vollständig schreiben"? Java Basics - Anfänger-Themen 13
T Klassen In Eingabefeld von externem Programm schreiben wenn angewählt. Java Basics - Anfänger-Themen 6
X Dateien direkt hintereinander schreiben, Dateiname Java Basics - Anfänger-Themen 25
G Messwerte in 2 Dateien schreiben Java Basics - Anfänger-Themen 20
I Input/Output 3 Werte in Datei schreiben, duplikate vermeiden Java Basics - Anfänger-Themen 4
H Integer in Datei schreiben Java Basics - Anfänger-Themen 2
W Java in "Terminal" schreiben Java Basics - Anfänger-Themen 9
D Datentypen StringToFloat-Methode schreiben Java Basics - Anfänger-Themen 0
P Telefontarif Programm schreiben Java Basics - Anfänger-Themen 5
L Methode schreiben die den maximalen Wert im Array ermittelt Java Basics - Anfänger-Themen 27
M Best Practice Wann eine Methode schreiben ? Java Basics - Anfänger-Themen 14
S Komma geht beim Schreiben ins csv verloren. Java Basics - Anfänger-Themen 6
F Input/Output Dateien lesen/schreiben Java Basics - Anfänger-Themen 1
O Bubblesort allgemeiner schreiben Java Basics - Anfänger-Themen 5
B Probleme bei "Daten in CSV File schreiben". Java Basics - Anfänger-Themen 9
R Button soll Wert 1 in Variable schreiben Java Basics - Anfänger-Themen 4
D spaltenweise Arrays in eine csv schreiben Java Basics - Anfänger-Themen 3
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
M Erste Schritte Java Applet - HTML Seiten auslesen und in Access Datenbank schreiben? Java Basics - Anfänger-Themen 15
P Objekt Cache schreiben? Java Basics - Anfänger-Themen 5
X Muss man das immer so schreiben o.O Java Basics - Anfänger-Themen 3
M Textdatei(en) in .jar schreiben Java Basics - Anfänger-Themen 5
Z Lotto mit Arrays schreiben Java Basics - Anfänger-Themen 4
F Listener schreiben Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben