Avatar billede VC1 Seniormester
17. maj 2022 - 17:00 Der er 4 kommentarer og
1 løsning

JAVA - Flyt ArrayList's elementer over i MySQL i et loop

Jeg har problemer med at få flyttet min ArrayListe til MySQL i et loop idet den kommer med følgende fejl:
''Duplicate entry '0' for key 'teamtable.PRIMARY''

Nogen der kan se fejlen eller måske give inputs til hvordan min indgangsvinkel skal være for at løse dette?

Koden:

  Connection connect = DriverManager.getConnection("jdbc:mysql://localhost:3306/bttest", "root", "Pasword");
            String query = "INSERT INTO teamtable (teamid, teamname)" + " values (?, ?)";

            PreparedStatement preparedStatement = connect.prepareStatement(query);

            for (int i = 0; i < CardCites.size(); i++) {
                String sql = "INSERT INTO teamtable (teamid, teamname) VALUES ('" + i + "','" + CardCites.get(i) + "')";
                preparedStatement.executeUpdate(sql);
            }
Avatar billede arne_v Ekspert
17. maj 2022 - 17:05 #1
Selve fejlen tyder på at der allerede er en række med et givet teamid.

Enten skal der ryddes op inden du loader data.

Eller så skal programmet kunne håndtere at der allerede er rækker i tabellen.
Avatar billede arne_v Ekspert
17. maj 2022 - 17:10 #2
Der er iøvrigt rodet lidt rund i Statement vs PreparedStatement.

Det er:

Statement stmt = con.createStatement();
for (int i = 0; i < cc.size(); i++) {
    stmt.executeUpdate("INSERT INTO teamtable (teamid, teamname) VALUES (" + i + ",'" + cc.get(i) + "')");
}

eller bedre:

PreparedStatement pstmt = con.prepareStatement("INSERT INTO teamtable (teamid, teamname) values (?, ?)");
for (int i = 0; i < cc.size(); i++) {
  pstmt.setInt(1, i);
  pstmt.setString(2, cc.get(i));
  pstmt.executeUpdate();
}
Avatar billede arne_v Ekspert
17. maj 2022 - 17:17 #3
Hvis du skal kunne håndtere at der allerede er teamid i tabellen, så er en mulighed at lave feltet til et auto increment felt.

Du angiver det ikke i INSERT og MySQL tager så selv den næste ledige værdi.
Avatar billede VC1 Seniormester
17. maj 2022 - 17:54 #4
Arne - Helt ærligt, du er for vild. Du er der HVER gang på mine spørgsmål med super kompetente svar. Det er altså virkelig værdsat, det skal du vide.

Du har helt ret, den havde ikke fjernet data fra MySQL, men jeg troede faktisk også at denne .executeUpdate ville overskrive det gamle. Kan man det eller skal man lave en delete før man sætter ind?

- Må også lige kigge på den med auto increment
Avatar billede arne_v Ekspert
17. maj 2022 - 18:21 #5
SQL INSERT indsætter en ny række - overskriver aldrig en eksisterende række.

SQL UPDATE opdaterer ingen, en eller flere eksistende rækker.

SQL DELETE sletter ingen, en eller flere eksistende rækker.

MySQL har en REPLACE som indsætter ny eller overskriver eksisterende, men den er MySQL specifik og stort set ingen bruger den.

.executeQuery() bruges til SELECT fordi den returnerer et ResultSet mens .executeUpdate() bruges til INSERT/UPDATE/DELETE fordi den returnerer antal rækker indsat/opdateret/slettet. Men forskellen er i hvad de returnerer til Java - funktionaliteten er 100% bestemt af SQL sætningen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





CIO
Stort CIO-interview: Lemvigh-Müllers milliard-omsætning er blevet digital